記錄撰寫爬蟲中遇到的一些坑
- 或許會持續更新(咕咕咕)
- 遇到的問題會分類總結
使用的Python庫
- requests:用于最基本的發送HTTP請求,包括get請求和post請求
- bs4:將獲得的HTTP回應體進行格式化組織,從而能夠進行多種檢索
- re:對檢索到的標簽更細化地提取資訊
- ThreadPoolExecutor, ProcessPoolExecutor:多執行緒與多行程,提高爬取速度
- 其他庫:os、time等等,用于其他各種非主要用途
反爬蟲繞過
請求頭
- 一些網站會檢測HTTP請求頭里的資訊,從而判斷是否是爬蟲訪問,此時需要對請求頭進行偽裝,
- 使用瀏覽器自帶的F12,查看每一次HTTP連接的請求頭,復制到代碼里并將其手動轉換成字典形式的header
- 在使用requests發送請求時,帶上引數headers=,
r=requests.get(url, headers=header);header必須是dict,這樣可以在請求時帶上給定的請求頭
cookies
請求速度
- 過快的請求速度(明顯超過一般瀏覽速度的請求)可能會被網站監測并被ban掉ip或是限制訪問
- 使用
time.sleep(random.randint(a,b))來暫停一個隨機時間 - 使用IP代理,在requests請求時,帶上引數
proxies=proxy,proxy應該是一個dict,形式為{'ip':'port'},可以有多個IP代理
- 使用
字符編碼問題
HTTP回應體的編碼
- 自動化解決方案:
import requests
r = requests.get(url)
r.encoding = r.apparent_encoding
這種方法自動猜測可能的編碼方式,并用這種編碼方式編碼回應體,但是猜測會存在一定的錯誤,自動選擇編碼方式會無法編碼某些特殊的字符,比如簡體中文、繁體中文
- 手動選擇編碼方式:
在請求到的html檔案首部,一般會有對本檔案編碼方式的宣告,例如<meta http-equiv='Content-Type' content='text/html; charset=gbk'>里的charset字符集為gbk,此時,r.encoding='gbk'就可以選擇gbk編碼
讀寫檔案的編碼
- Python檔案默認的是unicode編碼,有時候會出現unicode字符集無法編碼一些特定字符,報unicode錯誤
- 在
open()時,帶上encoding=引數,指定編碼方式encoding='utf-8',即可解決
- 在
網路問題
HTTPS驗證
- 一些使用HTTPS的網站在訪問時,需要進行HTTPS驗證,可以在requests請求時指定
verify='\path\of\CAbundle'引數來使用本地證書驗證,也可以簡單指定為verify=False不進行驗證 - 關掉驗證后urllib3會報一個warning,使用
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)關掉這個警告
網路延遲重試
- 使用
requests.DEFAULT_RETRIES = 10來修改requests庫默認的重試次數,在網路狀況不佳或是對方服務器性能不高導致請求失敗時使用
流式檔案下載
- 在requests請求時帶上
stream=True,實作流式下載,在請求大檔案時使用
并發問題
簡單使用ThreadPoolExecutor即可解決,
from future import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=int) as pool: # 宣告了一個執行緒池
pool.map(func, 可迭代資料結構如list)
需要考慮對臨界區資源進行加鎖,可以使用l=threading.lock()來宣告一個鎖,l.acquire()來加鎖,l.release()來解鎖
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/245547.html
標籤:其他
上一篇:C/C++編程筆記:C ++的三大資料型別(原始、派生、抽象)
下一篇:組合與繼承
