天天看點

用xpath和BeautifulSoup擷取免費代理

最近看到一篇文章:「關于爬蟲,這裡有一份《中國焦慮圖鑒》」,對于爬蟲分析的很透徹,建議大家看一下。想圍觀的朋友自己搜尋題目就可以找到。

如果你要問我在哪裡搜尋,我隻會讓你試着自己找答案。因為在你學習的過程中一定會遇到各種各樣奇奇怪怪的問題,難道都要問别人嗎?在學校有老師解答你的疑惑,走出學校,我們要試着自己獨立解決問題。我經常去的Stack Overflow上面,别人提的問題都是經過自己獨立思考,看到提問者對問題的了解,為解決問題嘗試過哪些方法,最後還是沒有解決才來提問,希望我們也能如此。

不扯别的,我們知道在爬蟲中最重要的不是後兩步,即解析資料,儲存資料,最重要的還是請求資料。

在爬取小規模的網頁,資料規模不大,網頁沒有什麼反爬技術的情況下,我們的爬蟲還是很好玩的,一旦我們要爬取的網頁反爬很強,我們擷取的資料量又非常大時,我們很容易就會被封ip,一旦IP被封,爬蟲就無法繼續下去。

正常的僞造請求頭,構造參數已經沒有辦法解決我們的問題。

在爬蟲的世界裡,永遠都是跟網頁的反爬技術做鬥争,封了我們的ip,我們還可以僞造ip,今天就帶大家擷取一些免費的ip。

這裡請求的是一個國内免費的ip髙匿代理IP網站:http://www.xicidaili.com/nn/

請求一頁就可以了,今天的代碼幫助大家随機生成一個該網站上提供的ip位址。

請求網頁

classSpider():

'''随機擷取一個IP位址'''

def__get_page(self):

'''擷取資料,添加請求頭'''

url ='http://www.xicidaili.com/nn/'

       headers = {

'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36'

' (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'

           }

       r = requests.get(url,headers=headers)

ifr.status_code ==200:

print('爬取成功')

returnr.text

由于這個ip代理網站沒有什麼反爬技術,基本上帶個請求頭就可以了。

解析網頁

這裡用了兩種方式解析網頁

def__parse_page(self,html):

'''這裡用了兩種方式擷取解析IP,傳回一個ip清單'''

'''soup = BeautifulSoup(html,'lxml')

       ips = soup.find_all('tr')#先找到節點tr

       ip_list = []

       for i in range(1,len(ips)):

           ip_info = ips[i]

           tds = ip_info.find_all('td')

           ip_list.append(tds[1].text + ':' +tds[2].text)

       return ip_list'''

       data = etree.HTML(html)

items = data.xpath('//tr[@class="odd"]')

foriteminitems:

ips = item.xpath('./td[2]/text()')[0]

tds = item.xpath('./td[3]/text()')[0]

ip_list.append(ips +':'+ tds)

returnip_list

這裡比較來看,我還是傾向于用xpath,一來簡單,再者性能還好,相比較BeautifulSoup來說,性能就沒那麼好了。

處理資料

接下來是一個随機函數,生成一個随機ip位址:

def__get_random_ip(self,ip_list):

       proxy_list = []

foripinip_list:

#周遊ip清單,添加http://

proxy_list.append('http://'+ ip)

proxy_ip = random.choice(proxy_list)#随機傳回一個ip

proxies = {'http':proxy_ip}#構造成字典。

returnproxies

defrun(self):

html =self.__get_page()

ip_list =self.__parse_page(html)

proxy =self.__get_random_ip(ip_list)

       print(proxy)

if__name__=='__main__':

   spider = Spider()

   spider.run()

   程式運作後,控制台輸出:

{'http':'http://110.73.8.27:8123'}

程式運作後随機生成一個ip位址,你可以拿去用,當然你也可以導入你需要僞裝ip的程式裡。

總結

看了開篇提到的那篇文章之後,結合最近看到聽到的消息,在想這樣一個問題「爬蟲犯法嗎?」

爬蟲犯不犯法,看你抓取的資料是什麼内容,就好比百度,谷歌的搜尋引擎每天在各個網站上爬到資料,展現給你。當然不犯法。

有位爬蟲大佬這樣說:

公開可查的就可以爬,這個就沒啥事。那些用某些特殊權限的賬号登入才可以的那就比較危險。還有必須破解才能爬的就構成犯罪了,另外,都建議使用代理ip,一個反爬,一個隐藏真實ip。

是以對于我們小白來說完全沒有問題,隻要不觸碰一些敏感未公開的資料就沒事。

公衆号sixkery,專注于python爬蟲。有任何學習上的問題都可以背景聯系我哦

繼續閱讀