聽說你好不容易寫了個爬蟲,結果沒抓幾個就被封了?(附工具)

Crossin先生發表於2019-02-16

近來知乎上如雨後春筍般冒出了大把大把的爬蟲教程。這是好事,學了 Python 基礎的同學們可以很輕鬆地搜出許多練手的例子。不過我不是針對誰,我是說網上絕大多數的爬蟲教程,其實都缺乏可操作性。

是的,也包括我自己寫過的。

主要原因有兩點:

  1. 教程是死的,網站是活的。頁面會改版,介面會更新。一個爬蟲教程的案例三個月之後還能有效已經是萬幸了。比如我自己教程裡的查天氣案例,介面改動過很多次,資料也早就不更新。但發出去的文章被轉發幾次後就很難再維護更新了。我也只能在自己的論壇上釋出更新訊息和問題答疑:【Python 第43課】 查天氣(1)
  2. 但凡資料比較有價值的網站,一定都會有反爬措施,既是對資料的保護,也是避免機器流量干擾到正常使用者的體驗。所以光是寫個網路請求,幾乎不可能成功拿到資料。反爬措施千千萬,應對反爬的手段萬萬千,這就是個不停鬥智鬥勇的過程,不存在一個教程就教會的萬金油方法。

反爬裡面最常見的一種手段就是,判斷你的請求頻率。如果你短時間內傳送了大量的請求,甭管你是不是人,先封你賬號或 IP 一段時間再說。所以,這就成了一個矛盾的地方:爬得太快會被封,爬得太慢又很耗時間。一般教程也許會說句:想要提升抓取效率並且降低被封的風險,可以使用代理 IP。然而這話說著倒輕鬆,網上免費的代理 IP 也不少,但每次找來能用的卻沒幾個。總不至於每次為了寫點小練習還去花錢買很多付費代理吧。況且現如今你真要買,也還未必能順利買到可用的。

於是我們決定自己動手,一勞永逸地解決這個老大難問題:實現一個自動獲取可用代理 IP 的介面。

基本思路還是從網上的幾大免費平臺獲取 IP 地址,不同的是我們定期去檢測 IP 的可用性。在呼叫介面時,提供可用性最高的 IP 地址列表。

網頁上列出了幾十個最新的推薦 IP,只是臨時找幾個做測試,可直接訪問檢視。

網頁地址:http://lab.crossincode.com/pr…

API 介面地址:http://lab.crossincode.com/pr…

請求方法:GET

頻率限制:不高於3秒1次

請求示例:

獲取 5 個 IP

http://lab.crossincode.com/pr…

獲取 5 個 HTTPS 的 IP

http://lab.crossincode.com/pr…

返回結果示例:

{
  "proxies": [
    {
      "http": "117.90.0.225:9000"
    },
    {
      "http": "186.154.146.26:8080"
    },
    {
      "http": "175.155.25.27:808"
    },
    {
      "http": "124.88.67.52:843"
    },
    {
      "http": "119.5.0.7:808"
    }
  ],
  "code": 1
}

於是,在你做爬蟲練習時,只要通過介面獲取幾個 IP,作為你請求的 proxy,即可大大提高抓取的效率。目前我們自己的爬蟲專案都在使用此介面。

不過仍然要說明,即使經過多次驗證,也無法保證一個 IP 的絕對可用性。不同時間不同地域不同網路都有可能導致請求超時或失效。所以你的程式碼中也還是需要自己做好相應的異常處理。這是個概率問題,工具的作用只是儘可能提高概率。

我們不生產 IP,我們只是網際網路的搬運工。

完整的介面引數說明,以及專案的原始碼,可在公眾號(Crossin的程式設計教室)後臺回覆 IP

相關文章