隨便記錄下寫爬蟲遇到的問題

記錄編寫爬蟲中遇到的一些坑

  1. 或許會持續更新(咕咕咕)
  2. 遇到的問題會分類總結

使用的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

  • 手動選擇編碼方式:
    在請求到的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便可解決。python

from future import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=int) as pool:  # 聲明瞭一個線程池
    pool.map(func, 可迭代數據結構如list)

須要考慮對臨界區資源進行加鎖,可使用l=threading.lock()來聲明一個鎖,l.acquire()來加鎖,l.release()來解鎖瀏覽器

相關文章
相關標籤/搜索