Python中如何解决爬取公司内部HTTPS网站时遇到的403错误
Forbidden
You don't have permission to access /
on this server.
1.我直接用浏览器是可以正常打开浏览的(只要连接到公司内部的网络,就可以打开,不需要登录域帐号)
2.然后我用 Postman 去 GET https://server_address 也能够成功 (我没有设置任何 header,只是填写了 server 地址,然后“发送”)
3.接着,在 postman 里面,能够拿到发送的信息,然后,postman 有个功能,可以直接转换成代码。里面有个是 python 的,我就转换了。
4.把转换后的代码,放到我的 python 脚本里面
结果就是上面的这个 403 提示了。 这个是咋回事儿呢? 难道我需要提供 username/password ?可是我浏览这个网站时,没有这些啊?
5.postman 还可以转换成 curl 的命令行( cur -X GET ......),我试了一下,居然也可以成功拿回 html 的完整内容。就是在 python 中不行。
谢谢!
Python中如何解决爬取公司内部HTTPS网站时遇到的403错误
有没有可能是 useragent 识别。
遇到403错误,通常是因为服务器拒绝了你的请求,最常见的原因是请求头不够“像浏览器”。很多网站(包括内部HTTPS站点)会检查User-Agent等请求头,如果看起来像爬虫,就直接返回403。
解决这个问题的核心是让你的请求看起来像一个正常的浏览器访问。这里给你一个可以直接运行的示例代码,它通过添加完整的请求头来模拟浏览器:
import requests
# 目标URL(请替换为你的内部网站地址)
url = 'https://your-internal-site.example.com'
# 关键:设置一个完整的、像浏览器的请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1',
}
# 如果需要处理公司内部证书或认证,可以在这里添加
# 例如,如果使用自签名证书,可以设置 verify=False(但会降低安全性)
# 或者指定证书路径:verify='/path/to/certificate.pem'
try:
response = requests.get(url, headers=headers, timeout=10)
# 检查响应状态
if response.status_code == 200:
print("请求成功!")
print("响应内容长度:", len(response.text))
# 处理你的数据...
else:
print(f"请求失败,状态码: {response.status_code}")
print("响应头:", response.headers)
except requests.exceptions.SSLError as e:
print(f"SSL证书错误: {e}")
# 对于内部站点,可能需要处理自签名证书
except requests.exceptions.RequestException as e:
print(f"请求发生错误: {e}")
如果上面的方法还不行,可以尝试这几个步骤:
-
检查是否需要会话(Session):有些网站需要维持会话状态。用
requests.Session()来保持cookies。session = requests.Session() response = session.get(url, headers=headers) -
检查是否需要登录认证:如果是需要登录的内部系统,你需要先模拟登录,获取有效的cookies或token,然后在后续请求中带上。
login_data = {'username': 'your_user', 'password': 'your_pass'} session.post(login_url, data=login_data) response = session.get(target_url) -
检查是否有其他安全策略:有些内部网站可能有IP白名单、额外的认证头(如API Key)或特定的反爬策略,需要根据具体情况调整。
总结:先加请求头模拟浏览器,不行再查登录和会话。
贴代码吧。。。
postman 可以,那就是你代码问题了
agent 头 识别 把比如 requests 这类的 ban 了?
应该是,豆瓣的 api 也是得加 useragent
抓包看结果
内网有的会看 cookie,建议问问 IT
建议你直接用 Selenium 模块来模拟浏览器访问网页,这样就不需要手动模拟各种 request headers 了。先从 chrome webdriver 开始,最后 phantomjs
兄弟
你说的抓包是说用什么 fiddle,鲨鱼 shark 这类工具么?不会……
我很早之前有用过一个叫 smartsniff 的工具,抓包的,分别正常浏览器打开网页,和用你的代码打开网页,对比抓到的包内容的区别。
是也乎 ╮(╯▽╰)╭
能用 cURL ?
那就用 py 调 cURL 通过 pipe 获得数据啊啊啊啊啊啊啊啊…
python 是胶水…不是白胶的~
之前遇到过类似的 分析之后用了 requests_ntml 解决了登陆问题
这个需要翻墙?

