错误:HTTPS网站需要发送“Referer头”,但未发送
你看到这个信息是因为这个HTTPS网站要求你的网页浏览器发送一个“Referer头”,但是没有发送。这个头是出于安全原因需要的,目的是确保你的浏览器没有被第三方劫持。
我在用requests登录一个网站时遇到了上面的错误,我该如何创建一个“Referer头”?
payload = {'inUserName': 'xxx.com', 'inUserPass': 'xxxxxx'}
url = 'https:xxxxxx'
req=requests.post(url, data=payload)
print(req.text)
3 个回答
0
我在Chrome浏览器里也遇到了同样的错误。我做的就是把所有的Chrome扩展程序都禁用了,包括广告拦截器。然后我重新加载了我想要抓取数据的页面,再次登录。接着在代码里,像@Stephan Kulla提到的那样,你需要在请求的头部添加一些信息。我添加了用户代理、来源、引用政策和来源地址。这些信息你可以通过检查网页的方式找到,在网络部分就能看到。把这些都加到请求头里,然后再试着用POST方式登录,应该就能成功了。(我这样做是有效的)
ori = 'https:......'
login_route = 'login/....'
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36' , 'origin':'https://www.screener.in', 'referer': '/login/','referrer-policy':'same-origin'}
s=requests.session()
csrf = s.get(ori+login_route).cookies['csrftoken']
payload = {
'username': 'xxxxxx',
'password': 'yyyyyyy',
'csrfmiddlewaretoken': csrf
}
login_req = s.post(ori+login_route,headers=header,data=payload)
2
你可以把想要在请求中发送的头信息作为关键字参数传递给 request.post
方法:
payload = {'inUserName': 'xxx.com', 'inUserPass': 'xxxxxx'}
url = 'https:xxxxxx'
req=requests.post(url, data=payload, headers={'Referer': 'yourReferer')
print(req.text)
2
我猜你正在使用这个库:http://docs.python-requests.org/en/latest/user/quickstart/
如果是这样的话,你需要添加一个自定义的头信息叫做 Referer
(可以查看自定义头信息这一节)。代码大概是这样的:
url = '...'
payload = ...
headers = {'Referer': 'https://...'}
r = requests.post(url, data=payload, headers=headers)
想了解更多关于referer的信息,可以看看这篇维基百科的文章:https://en.wikipedia.org/wiki/Referer