近來知乎上如雨後春筍般冒出了大把大把的爬蟲教程。這是好事,學了 Python 基礎的同學們可以很輕鬆地搜出許多練手的例子。不過我不是針對誰,我是說網上絕大多數的爬蟲教程,其實都缺乏可操作性。
是的,也包括我自己寫過的。
主要原因有兩點:
- 教程是死的,網站是活的。頁面會改版,介面會更新。一個爬蟲教程的案例三個月之後還能有效已經是萬幸了。比如我自己教程裡的查天氣案例,介面改動過很多次,資料也早就不更新。但發出去的文章被轉發幾次後就很難再維護更新了。我也只能在自己的論壇上釋出更新訊息和問題答疑:【Python 第43課】 查天氣(1)。
- 但凡資料比較有價值的網站,一定都會有反爬措施,既是對資料的保護,也是避免機器流量干擾到正常使用者的體驗。所以光是寫個網路請求,幾乎不可能成功拿到資料。反爬措施千千萬,應對反爬的手段萬萬千,這就是個不停鬥智鬥勇的過程,不存在一個教程就教會的萬金油方法。
反爬裡面最常見的一種手段就是,判斷你的請求頻率。如果你短時間內傳送了大量的請求,甭管你是不是人,先封你賬號或 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。