開始寫一個爬蟲(1)
因為是作為筆記寫的,所以會很啰嗦,而且代碼不會全部展示。。
首先,你要確定一個目標,就是你要爬的網站。我選的就不說了,比較邪惡,需要18歲以下的小僵屍繞路。
選好之後,構思下整個腳本的大致結構。
1.通過網站的查詢接口出一組比較感興趣的話題下的一些分組,獲取這些分組URL,存儲成一個list.
2.循環訪問這些分組的URL.
3.爬取每個分組下的圖片。
(1)獲取圖片的URL,以list存儲。
(2) 下載圖片。
(3)判斷下一頁是否存在,如果存在,拼接URL,訪問下一頁。不存在的話,訪問下一組圖片。
ok,結構很簡單。
然後開始選擇工具。
我使用的python版本是3.6,IDE是pycharm,庫是urllib.request url.error re socket。
代碼中最重要的兩個函數urllib.request.Request()和urllib.request.urlopen()
給個敵臺鏈接https://blog.csdn.net/bo_mask/article/details/76067790 講的蠻好的。我自己研究的之後在寫。
urllib.request.urlopen()返回的是網頁的 HTTPResposne 類型的對象,使用read()函數讀取返回的時候,由於圖片的返回方式為byte類型,所以需要decode()轉碼。
如果轉碼成‘UTF-8’,可能會出現一個報錯‘‘utf-8‘ codec can‘t decode byte 0xcb in position 134: invalid continuation byte’,歸根到底是編碼的錯誤。
再網上看到三個解決方式:
1.腳本開頭寫 #coding: utf-8 ,我這邊沒管用。
2.變一種編碼方式,如decode(‘GBK‘)
3.修改第二個參數errors,decode(encoding,errors),該參數的作用是‘設置不同錯誤的處理方案’。修改值為‘ignore‘.
小備註:其他可能得值有 ‘ignore‘, ‘replace‘, ‘xmlcharrefreplace‘, ‘backslashreplace‘ 以及通過 codecs.register_error() 註冊的任何值。
再提一個小小的點,請求處一般要寫一個拋出錯誤的處理,網絡斷開之後,直接退出程序。
如:
try:
file = url_req(url,header)
except err.HTTPError as e:
print(‘network mistake: %s‘, e)
exit()
except Exception as e:
print(e)
exit()
有點小累,休息一會兒。
另外紀念一下今天杭州下大雪。
開始寫一個爬蟲(1)