Python 3.x 中"HTTP Error 403: Forbidden"問題的解決方案

轉載自 http://www.2cto.com/kf/201309/242273.html


問題:

urllib.request.urlopen() 方法經常會被用來打開一個網頁的源代碼,然後會去分析這個頁面源代碼,但是對於有的網站使用這種方法時會拋出"HTTP Error 403: Forbidden"異常。


例如: 執行下面的語句時 

urllib.request.urlopen("http://blog.csdn.net/eric_sunah/article/details/11099295")


會出現以下異常:

File "D:\Python32\lib\urllib\request.py", line 475, in open  
    response = meth(req, response)  
  File "D:\Python32\lib\urllib\request.py", line 587, in http_response  
    'http', request, response, code, msg, hdrs)  
  File "D:\Python32\lib\urllib\request.py", line 513, in error  
    return self._call_chain(*args)  
  File "D:\Python32\lib\urllib\request.py", line 447, in _call_chain  
    result = func(*args)  
  File "D:\Python32\lib\urllib\request.py", line 595, in http_error_default  
    raise HTTPError(req.full_url, code, msg, hdrs, fp)  
urllib.error.HTTPError: HTTP Error 403: Forbidden


分析:

之所以出現上面的異常,是因爲如果用 urllib.request.urlopen() 方式打開一個URL,服務器端只會收到一個單純的對於該頁面訪問的請求,但是服務器並不知道發送這個請求使用的瀏覽器,操作系統,硬件平臺等信息,而缺失這些信息的請求往往都是非正常的訪問,例如爬蟲。


有些網站爲了防止這種非正常的訪問,會驗證請求信息中的UserAgent(它的信息包括硬件平臺、系統軟件、應用軟件和用戶個人偏好),如果UserAgent存在異常或者是不存在,那麼這次請求將會被拒絕(如上錯誤信息所示)

所以可以嘗試在請求中加入UserAgent的信息。


方案:

對於Python 3.x來說,在請求中添加UserAgent的信息非常簡單,代碼如下:

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}  
req = urllib.request.Request(url=chaper_url, headers=headers)  
urllib.request.urlopen(req).read() 

谷歌瀏覽器中如何查看headers信息

http://jingyan.baidu.com/article/27fa73268ff4e146f8271f33.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章