爬蟲---Python爬蟲IP代理池的建立和使用

同一個IP針對一個網站短時間內大量的訪問通常會導致IP被封,除了在爬取數據時增加延遲(爬取量不大或者對爬取速度沒要求),還有一個好方法就是使用代理IP,這樣就可以完美解決IP被封的問題。

那麼,問題來了,代理的IP從哪兒來呢,土豪自然隨意,直接淘寶買一些代理IP就好,穩定也不是特別貴。但對於技術愛好者,也許並沒有那個需求,其實網上還是有很多免費的代理IP的,隨意打開百度一搜就是,選擇第一個不是廣告的網站爲例


可以看到,選擇還是蠻多的,那麼我們就從這個網站上抓取一些代理IP來使用吧,它的網址結構是'http://www.xicidaili.com/nn/'+PageNumber,每頁有50個代理IP,可以很方便的用for循環來爬取所有代理IP。查看網頁源碼,發現所有的IP和端口都在<tr class="">下第二個和第三個td類下,結合BeautifulSoup可以很方便地抓取信息,源代碼如下

[python] view plain copy
  1. import urllib2  
  2. from bs4 import BeautifulSoup  
  3. import csv  
  4.   
  5.   
  6.   
  7.   
  8. def IPspider(numpage):  
  9.     csvfile = file('ips.csv''wb')    
  10.     writer = csv.writer(csvfile)  
  11.     url='http://www.xicidaili.com/nn/'  
  12.     user_agent='IP'  
  13.     headers={'User-agent':user_agent}  
  14.     for num in xrange(1,numpage+1):  
  15.         ipurl=url+str(num)  
  16.         print 'Now downloading the '+str(num*100)+' ips'  
  17.         request=urllib2.Request(ipurl,headers=headers)  
  18.         content=urllib2.urlopen(request).read()  
  19.         bs=BeautifulSoup(content,'html.parser')  
  20.         res=bs.find_all('tr')  
  21.         for item in res:  
  22.             try:  
  23.                 temp=[]  
  24.                 tds=item.find_all('td')  
  25.                 temp.append(tds[1].text.encode('utf-8'))  
  26.                 temp.append(tds[2].text.encode('utf-8'))  
  27.                 writer.writerow(temp)  
  28.             except IndexError:  
  29.                     pass  
  30.               
  31. #假設爬取前十頁所有的IP和端口  
  32. IPspider(10)  
這樣就爬到了1000個代理IP和端口,當然了,免費也有免費的壞處,那就是並不是所有的代理IP都可以用,所以我們需要檢查一下哪些IP是可以使用的。如何檢查該IP是否可用,我們就看連上代理後能不能在2秒內打開百度的頁面,如果可以,則認爲IP可用,添加到一個list裏供後面備用,實現代碼如下。

[python] view plain copy
  1. import socket  
  2. def IPpool():  
  3.     socket.setdefaulttimeout(2)  
  4.     reader=csv.reader(open('ips.csv'))  
  5.     IPpool=[]  
  6.     for row in reader:  
  7.         proxy=row[0]+':'+row[1]  
  8.         proxy_handler=urllib2.ProxyHandler({"http":proxy})  
  9.         opener=urllib2.build_opener(proxy_handler)  
  10.         urllib2.install_opener(opener)  
  11.         try:  
  12.             html=urllib2.urlopen('http://www.baidu.com')  
  13.             IPpool.append([row[0],row[1]])  
  14.         except Exception,e:  
  15.             continue  
  16.     return IPpool  
這樣的話,就取得了一系列可用的IP代理,配合之前的爬蟲使用,就不太容易出現IP被封的情況了,不過在目前這種情況下,驗證IP所需要的時間太久,所以可以採用多線程或者多進程的方法來進一步提高效率
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章