簡體   English   中英

python urllib.request - 可能有效的標頭

[英]python urllib.request - headers that are likely to work

正在編寫一個小腳本來從網站獲取信息。 我遇到了 HTTP 錯誤的問題。

req = urllib.request.Request(lnk['href'],
   headers={'User-Agent': 'Mozilla/5.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'})
page = urllib.request.urlopen(req)

例如,當嘗試獲取http://www.guru99.com/node-js-tutorial.html我收到一系列錯誤,以 406 Unacceptable 結尾:

Traceback (most recent call last):
  File "get_links.py", line 45, in <module>
    page = urllib.request.urlopen(req)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", line 162, in urlopen
    return opener.open(url, data, timeout)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", line 471, in open
    response = meth(req, response)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", line 581, in http_response
    'http', request, response, code, msg, hdrs)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", line 509, in error
    return self._call_chain(*args)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", line 443, in _call_chain
    result = func(*args)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", line 589, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 406: Not Acceptable

谷歌搜索我發現我應該修復標題(正如我上面所做的那樣)和許多關於如何修復標題的教程。 除了 - 沒有多少實際工作。

是否有一些好的標題可能不會對大多數網站造成問題? 是否有其他人創建的一些 python 模塊已經包含常用的頭文件? 有沒有好的方法可以用不同的標頭重試幾次直到得到好的響應?

這似乎是每個使用 Python 進行網絡抓取的人都會遇到的問題,而且我還沒有找到合適的解決方案。

以下一組標題似乎適用於大多數測試。 如果其他人有任何建議,請提供。 如果一組不起作用,我也對嘗試不同標題的好解決方案感興趣。

req = urllib.request.Request(lnk['href'],
   headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'})
page = urllib.request.urlopen(req)

HTTP 錯誤 406 不可接受

超文本傳輸​​協議 (HTTP) 406 不可接受客戶端錯誤響應代碼表示服務器無法生成與請求的主動內容協商標頭中定義的可接受值列表匹配的響應,並且服務器不願意提供默認表示。

所以我可以看到問題出在您的User-Agent: Mozilla/5.0鍵和值上。 這是一堆正確的用戶代理的鏈接,

因此,將您的代碼更改為以下內容,

headers={'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'})

我知道答案為時已晚,但希望這對其他人有所幫助。

我嘗試了您的代碼,但得到了與預期相同的錯誤。

我也用我的 Chrome 瀏覽器提供的用戶代理嘗試過,這似乎有效

Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36

.. 並且在不傳遞顯式標頭的情況下運行測試,該標頭也返回了 http 200(成功)。 這將使用庫提供的默認頭文件,例如

python-requests/2.10.0

希望這有幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM