網路爬蟲編寫常見問題

Laical發表於2020-07-30

要編寫爬蟲程式,首先必須找一個爬蟲框架,如果你使用Python語言,可以選用scrapy,如果你使用Java語言,可選用WebMagic,本文使用後者,編寫爬蟲程式無非分以下幾步:

根據URL下載網頁,得到HTML(注意並不是通過開發工具看到的HTML,而是網頁原始碼HTML,這兩者有本質區別);

根據HTML解析您所需要的資料,可以利用xpath獲取DOM節點內容或屬性值;

有可能還需要根據得到的HTML解析出其他連結,利用多執行緒繼續爬取;

解析後的資料儲存(資料庫,檔案等);

WebMagic爬蟲框架在core程式碼中主要有四個模組:Downloader、PageProcessor、Scheduler、Pipeline,分別處理下載,頁面解析,管理(管理待抓取的URL,做一些去重工作,預設使用記憶體佇列管理URL,也可以使用Redis進行分散式管理)和持久化工作,因為最終解析出的結構化資料應該是要入庫或入檔案儲存的。

通過代理上網解決IP被封問題

有時候抓取的站點會封我們的IP,公司的外網IP又是固定的,我們可以通過ADSL撥號的方式接入另一個網路,在ADSL網路的伺服器上搭建代理伺服器,爬蟲程式所在的伺服器通過代理該臺伺服器上網,這樣再也不怕對方站點封您的IP了,讓爬蟲程式通過代理爬取網頁,程式碼如下:

import requests import random # 要訪問的目標頁面 targetUrl = “http://httpbin.org/ip" # 要訪問的目標HTTPS頁面 # targetUrl = “https://httpbin.org/ip" # 代理伺服器(產品官網 www.16yun.cn) proxyHost = “t.16yun.cn” proxyPort = “31111” # 代理隧道驗證資訊 proxyUser = “username” proxyPass = “password” proxyMeta = “http://%(user)s:%(pass)s@%(host)s:%(port)s” % { “host” : proxyHost, “port” : proxyPort, “user” : proxyUser, “pass” : proxyPass, } # 設定 http和https訪問都是用HTTP代理 proxies = { “http” : proxyMeta, “https” : proxyMeta, } # 設定IP切換頭 tunnel = random.randint(1,10000) headers = {“Proxy-Tunnel”: str(tunnel)} resp = requests.get(targetUrl, proxies=proxies, headers=headers) print resp.status_code print resp.text

反爬 / 封 IP

對於封 IP 的情況,可以分為幾種情況來處理:

  • 首先尋找手機站點、App 站點,如果存在此類站點,反爬會相對較弱。
  • 使用代理,如抓取免費代理、購買億牛雲付費代理、使用 Tor 代理、Socks 代理等。
  • 在代理的基礎上維護自己的代理池,防止代理浪費,保證實時可用。

反爬 / 驗證碼

驗證碼分為非常多種,如普通圖形驗證碼、算術題驗證碼、滑動驗證碼、點觸驗證碼、手機驗證碼、掃二維碼等。

  • 對於普通圖形驗證碼,如果非常規整且沒有變形或干擾,可以使用 OCR 識別,也可以使用機器學習、深度學習來進行模型訓練,當然打碼平臺是最方便的方式。
  • 對於算術題驗證碼,推薦直接使用打碼平臺。
  • 對於滑動驗證碼,可以使用破解演算法,也可以模擬滑動。後者的關鍵在於缺口的找尋,可以使用圖片比對,也可以寫基本的圖形識別演算法,也可以對接打碼平臺,也可以使用深度學習訓練識別介面。
  • 對於點觸驗證碼,推薦使用打碼平臺。
  • 對於手機驗證碼,可以使用驗證碼分發平臺,也可以購買專門的收碼裝置,也可以人工驗證。
  • 對於掃二維碼,可以人工掃碼,也可以對接打碼平臺。

反爬 / 封賬號

某些網站需要登入才能爬取,但是一個賬號登入之後請求過於頻繁會被封號,為了避免封號,可以採取如下措施:

  • 尋找手機站點或 App 站點,此種類別通常是介面形式,校驗較弱。
  • 尋找無登入介面,儘可能尋找⽆無需登入即可爬取的介面。
  • 維護 Cookies 池,使⽤用批量賬號模擬登入,使⽤時隨機挑選可用 Cookies 使⽤即可實現

爬蟲中會遇到各種問題,做好爬蟲相關優化,使用高質量億牛雲代理才能更加高效穩定採集相關資料。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章