requests.get 返回 403,而相同的 url 在浏览器中有效
Posted
技术标签:
【中文标题】requests.get 返回 403,而相同的 url 在浏览器中有效【英文标题】:requests.get returns 403 while the same url works in browser 【发布时间】:2017-06-16 05:10:54 【问题描述】:我正在尝试使用rlsnet.ru 的搜索表单。这是我从源文件中提取的表单定义:
<form id="site_search_form" action="/search_result.htm" method="get">
<input id="simplesearch_text_input" class="search__field" type="text" name="word" value="" autocomplete="off">
<input type="hidden" name="path" value="/" id="path">
<input type="hidden" name="enter_clicked" value="1">
<input id="letters_id" type="hidden" name="letters" value="">
<input type="submit" class="g-btn search__btn" value="Найти" id="simplesearch_button">
<div class="sf_suggestion">
<ul style="display: none; z-index:1000; opacity:0.85;">
</ul>
</div>
<div id="contentsf">
</div>
</form>
这是我用来发送搜索请求的代码:
import requests
from urllib.parse import urlencode
root = "http://www.rlsnet.ru/search_result.htm?"
response = requests.get(root + urlencode("word": "Церебролизин".encode('cp1251'))
每次我这样做时,响应状态都是 403。当我在 Safari/Chrome/Opera 中输入相同的请求 URL(即http://www.rlsnet.ru/search_result.htm?word=%D6%E5%F0%E5%E1%F0%EE%EB%E8%E7%E8%ED
)时,它可以正常工作并返回预期的页面。我究竟做错了什么?谷歌搜索这个问题只带来了这个 SO 问题:why url works in browser but not using requests get method,这没什么用。
【问题讨论】:
【参考方案1】:那是因为requests
的默认User-Agent
是python-requests/2.13.0
,并且在您的情况下,该网站不喜欢来自“非浏览器”的流量,因此他们试图阻止此类流量。
>>> import requests
>>> session = requests.Session()
>>> session.headers
'Connection': 'keep-alive', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'User-Agent': 'python-requests/2.13.0'
您需要做的就是让请求看起来像是来自浏览器,所以只需添加一个额外的header
参数:
import requests
headers = 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/56.0.2924.76 Safari/537.36' # This is chrome, you can set whatever browser you like
response = requests.get('http://www.rlsnet.ru/search_result.htm?word=%D6%E5%F0%E5%E1%F0%EE%EB%E8%E7%E8%ED', headers=headers)
print response.status_code
print response.url
200
http://www.rlsnet.ru/search_result.htm?word=%D6%E5%F0%E5%E1%F0%EE%EB%E8%E7%E8%ED
【讨论】:
以上是关于requests.get 返回 403,而相同的 url 在浏览器中有效的主要内容,如果未能解决你的问题,请参考以下文章
python requests.get()返回不正确解码的文本而不是UTF-8?
为啥 requests.get() 不返回? requests.get() 使用的默认超时是多少?