從零開始寫Python爬蟲 --- 3.2 爬蟲實踐:獲取快代理

在前面的Scrapy爬蟲里,我們已經寫了一個爬取代理的爬蟲了,這次我們通過模擬瀏覽器用Selenium&PhantomJS的方式重新寫一遍,來看看這兩者有啥不同。

目標分析:

本次要爬的網站是:快代理 :快代理 - 高速http代理ip每天更新

雖然這個網站並沒有對爬蟲限制,我們用requests庫就能順利get頁面代碼,但是為了掌握Selenium的使用方式,我們還是來通過這種方式寫一遍。

看一下頁面的樣子:

我們就按這種布局,在html頁面里找到代理的 ip 埠 位置等信息。

數據的篩選:

打開Chrome開發者工具,手動定位到一條代理的位置:

可以看到,每條代理都放在tr列表中,

每個tr里有包含著多個td列來顯示不同的信息。

這樣的結構我們可以通過多種方法來定位數據

  • bs4
  • Xpath
  • Selenium自帶的方法

具體代碼怎麼寫,我相信大家都會有自己的方式吧

代碼的書寫:

這次我們採用面向對象的方式寫這一段代碼:

nselenium模擬瀏覽器爬蟲nn爬取快代理:http://www.kuaidaili.com/nnnfrom selenium import webdrivernnnclass Item(object):n n 我們模擬Scrapy框架n 寫一個item類出來,n 用來表示每一個爬到的代理n nn ip = None # ip地址n port = None # 埠n anonymous = None # 是否匿名n type = None # http or httpsn local = None # 物理地址n speed = None # 速度nnclass GetProxy(object):n n 獲取代理的類n nn def __init__(self):n n 初始化整個類n n self.starturl = http://www.kuaidaili.com/free/inha/n self.urls = self.get_urls()n self.proxylist = self.get_proxy_list(self.urls)n self.filename = proxy.txtn self.saveFile(self.filename,self.proxylist)nn def get_urls(self):n n 返回一個代理url的列表n n urls = []n for i in range(1,2):n url = self.starturl+str(i)n urls.append(url)n return urlsnn def get_proxy_list(self,urls):n n 返回抓取到代理的列表n 整個爬蟲的關鍵n nn browser = webdriver.PhantomJS()n proxy_list = []n n n for url in urls:n browser.get(url)n browser.implicitly_wait(3)n # 找到代理table的位置n elements = browser.find_elements_by_xpath(//tbody/tr)n for element in elements:n item = Item()n item.ip = element.find_element_by_xpath(./td[1]).textn item.port = element.find_element_by_xpath(./td[2]).textn item.anonymous = element.find_element_by_xpath(./td[3]).textn item.local = element.find_element_by_xpath(./td[4]).textn item.speed = element.find_element_by_xpath(./td[5]).textn print(item.ip)n proxy_list.append(item)n n browser.quit()n return proxy_listn n def saveFile(self,filename,proxy_list):n n 將爬取到的結果寫到本地n n with open(filename,w) as f:n for item in proxy_list:n n f.write(item.ip + t)n f.write(item.port + t)n f.write(item.anonymous + t)n f.write(item.local + t)n f.write(item.speed + nn)nnnif __name__ ==__main__:n Get = GetProxy() n

代碼解釋:

這次的爬蟲本身十分的簡單,詳細的注釋也都附在代碼里了,

相信一路跟著這份筆記走過來的同學都能看的明白。

但是我還是稍微解釋一下吧:

一開始我們模仿Scrapy定義了一個ITEM類,每一個item都包含了一條結果所需要的所有數據,然後一條一條傳回去給其他函數調用。

接著我們寫了三個函數:

get_urls()

這個函數功能是返回一個需要爬取代理頁面的url鏈接的列表

get_proxy_list()

這個函數通過Selenium和PhantomJS模擬一個瀏覽器環境,

首先 從get_urls函數返回的列表中拿出一個鏈接,打開

接著 在瀏覽器里通過find_elements_by_xpath()方法來找到每一條我們需要的數據,並保存在item里。

最後 將item返回給saveFile()函數處理。

saveFile()

這個函數沒什麼好說的,

就是將item理的數據寫入到本地。

保存在proxy.txt文本中。

結果展示:

為了節省調式的時間,我只爬取了前兩頁的代理,

結果保存在proxy.txt:

117.90.3.153 9000 高匿名 HTTP 中國 江蘇省 鎮江市 電信nn202.111.9.106 23 高匿名 HTTP 中國 江蘇省 常州市 聯通nn27.29.158.127 8998 高匿名 HTTP 中國 湖北省 襄樊市 電信nn117.90.3.114 9000 高匿名 HTTP 中國 江蘇省 鎮江市 電信nn120.24.182.175 8118 高匿名 HTTP 中國 廣東省 深圳市 阿里雲nn121.232.144.21 9000 高匿名 HTTP 中國 江蘇省 鎮江市 電信nn59.78.47.184 1080 高匿名 HTTP 中國 上海市 上海市 教育網nn58.218.145.163 8998 高匿名 HTTP 中國 江蘇省 徐州市 電信nn121.232.145.139 9000 高匿名 HTTP 中國 江蘇省 鎮江市 電信nn117.90.4.219 9000 高匿名 HTTP 中國 江蘇省 鎮江市 電信nn175.8.26.191 808 高匿名 HTTP 中國 湖南省 長沙市 電信nn171.12.166.209 808 高匿名 HTTP 中國 河南省 漯河市 電信nn121.232.144.44 9000 高匿名 HTTP 中國 江蘇省 鎮江市 電信nn117.90.5.229 9000 高匿名 HTTP 中國 江蘇省 鎮江市 電信n

當然,如果要真的用的話,還需要配合我上次寫的代理驗證程序~

好了,這次就到這裡,相信會寫這個簡單的Selenium模擬瀏覽器爬蟲,

其他複雜的網站也是能一通百通的。

每天的學習記錄都會 同步更新到:

微信公眾號: findyourownway

知乎專欄:從零開始寫Python爬蟲 - 知乎專欄

blog : www.ehcoblog.ml

Github: Ehco1996/Python-crawler

推薦閱讀:

python 高度魯棒性爬蟲的異常和超時問題
基於微博數據用 Python 打造一顆「心」
第100篇文章紀念(? ?_?)?
4行Python代碼獲取所在城市天氣預報
【爬蟲】解決封IP問題:1.利用ADSL伺服器

TAG:Python | 爬虫 | Selenium |