手把手教你用免費代理IP爬數(shù)據(jù)
一.前言
玩爬蟲的都避免不了各大網(wǎng)站的反爬措施限制,比較常見的是通過固定時間檢測某ip地址訪問量來判斷該用戶是否為 “網(wǎng)絡(luò)機器人”,也就是所謂的爬蟲,如果被識別到,就面臨被封ip的風險,那樣你就不能訪問該網(wǎng)址了。
通用的解決辦法是用代理ip進行爬取,但是收費的代理ip一般都是比較貴的,網(wǎng)上倒是有很多免費的代理ip網(wǎng)站,但是受時效性影響,大部分地址都不能用,有很多維護代理ip池的教程,即把爬取并檢測后能用代理ip放到“代理池里”,等以后要用的時候再從里面提取,在我看來,這種效率比較低,因為這類IP地址很快就失效,我們要做的是邊檢測邊使用,充分保證免費IP的時效性。
二.抓取IP地址
下面就開始實戰(zhàn)操作。
1.首先我們隨便找一個免費代理ip網(wǎng)站,如下圖所示。
2、打開網(wǎng)頁查看器,分析其網(wǎng)頁元素結(jié)構(gòu),如下圖所示。
3、就是一個簡單的靜態(tài)網(wǎng)頁,我們用requests和bs4將ip地址和對應(yīng)端口爬下,如下圖所示。
4、每一行ip地址都由5個標簽組成,而我們需要的是第一個標簽(對應(yīng)IP地址)和第2個標簽(對應(yīng)端口),所以從第一個開始,每隔5個取出ip地址(item[::5]),從第二個開始,每隔5個取出對應(yīng)端口(item[1::5]),參數(shù)n為頁碼,每次只在1頁取1個有用的ip地址,最終效果如下圖所示:
三.驗證IP有效性
這里把百度百科作為目標網(wǎng)站,這個看似很普通的網(wǎng)站,反爬措施卻極為嚴格,爬不了幾條內(nèi)容就開始請求失敗了,下面我以在百度百科查詢?nèi)珖疖囌練w屬地信息為例演示如何使用免費代理ip。
1、首先我在12306上把所有的火車站名都爬下來了,但是沒有歸屬地信息。
2、然后以站名構(gòu)造百度百科url信息,分析網(wǎng)頁元素,把爬取爬取火車站地址信息,網(wǎng)頁元素如下圖所示:
3、所以,我們只需在class_='basicInfo-item'的標簽內(nèi)容里查找有無“省”或者“市”的字符,然后輸出就行了,最后加一個while True循環(huán),當該ip能正常爬數(shù)據(jù)時,則break該循環(huán);若該ip被禁,則馬上重新請求一個新ip進行爬取。直接上代碼如下圖所示:
4、其中for循環(huán)是遍歷所有火車站,try是用于檢測該ip還能不能用,若不能,則在except里請求1個新ip,爬取效果如下圖所示:
下次再遇到爬蟲被禁的情況就可以用此辦法解決了。
四.結(jié)語
本文基于Python網(wǎng)絡(luò)爬蟲技術(shù),主要介紹了去IP代理網(wǎng)站上抓取可用IP,并且Python腳本實現(xiàn)驗證IP地址的時效性,如遇到爬蟲被禁的情況就可以用本文的辦法進行解決。