1. 程式人生 > >Python3 爬蟲編寫報錯及解決方法整理

Python3 爬蟲編寫報錯及解決方法整理

將爬蟲執行過程中遇到的錯誤進行整理,方便後來查詢
執行環境:Python3.6+Pydev

編碼錯誤

執行時候報錯:UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\u2022’ in position 16707: illegal multibyte

分析:看描述是編碼方面的問題;
解決方法:專案—>屬性

設定屬性
將編碼改成utf-8
改變內部編碼
執行程式,問題解決。

再爬小說網站的時候,報錯:UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xc1 in position 183: invalid start byte

分析:還是編碼方面的問題,這次和上一個不同的是utf-8看來不行;
解決方法:改成GBK試一試

html = urllib.request.urlopen(req).read().decode('GBK')

剛看到一篇文章,對這些編碼問題分析解決進行了歸納,很多方法值得借鑑

UnicodeEncodeError: ‘gbk’
其中講了一個比較好的方法
將原先的utf-8的字元轉換為Unicode的時候,其實更加安全的做法,也可以將:

titleUni = titleHtml.decode(“UTF-8”);

替換為:

titleUni = titleHtml.decode(“UTF-8”, ‘ignore’);

這樣可以實現,即使對於那些,相對來說是無關緊要的一些特殊字元,也可以成功編碼,避免編碼出錯,提高程式的健壯性。

unicode中的‘\xa0’字元在轉換成gbk編碼時會出現問題,gbk無法轉換’\xa0’字元。

所以,在轉換的時候必需進行一些前置動作:

string.replace(u'\xa0', u' ')  

將’\xa0‘替換成u’ ‘空格。

關於urllib

1、在獲取網易公開課_視訊連結 的爬蟲程式碼裡,看到這樣的寫法

key = urllib.parse.quote(keyword)  

知乎上的解釋是:

urllib 庫中的 quote? 在 Python2.x 中的用法是:

urllib.quote(text)

Python3.x 中是

urllib.parse.quote(text)

按照標準, URL 只允許一部分 ASCII 字元(數字字母和部分符號),其他的字元(如漢字)是不符合 URL 標準的。所以 URL 中使用其他字元就需要進行 URL 編碼。URL 中傳引數的部分(query String),格式是:name1=value1&name2=value2&name3=value3
假如你的 name 或者 value 值中有『&』或者『=』等符號,就當然會有問題。所以URL中的引數字串也需要把『&=』等符號進行編碼。URL編碼的方式是把需要編碼的字元轉化為 %xx 的形式。通常 URL 編碼是基於 UTF-8 的(當然這和瀏覽器平臺有關)。例子:比如『我』,unicode 為 0x6211, UTF-8 編碼為 0xE6 0x88 0x91,URL 編碼就是 %E6%88%91
在 JavaScript 中,提供了 encodeURI 和 encodeURIComponent 兩種方法對 URL 進行編碼;Python 的 urllib 庫中提供了 quote 和 quote_plus 兩種方法。因為是針對不同場景設計,以上四種方法編碼的範圍均不相同,比如 quote 除了 -._/09AZaz ,都會進行編碼。quote_plus 比 quote 『更進』一些,它還會編碼 /urllib.quote
使用參考:21.8.1. URL Parsing