同一個IP針對一個網站短時間內大量的訪問通常會導致IP被封,除了在爬取數據時增加延遲(爬取量不大或者對爬取速度沒要求),還有一個好方法就是使用代理IP,這樣就可以完美解決IP被封的問題。
那麼,問題來了,代理的IP從哪兒來呢,土豪自然隨意,直接淘寶買一些代理IP就好,穩定也不是特別貴。但對於技術愛好者,也許並沒有那個需求,其實網上還是有很多免費的代理IP的,隨意打開百度一搜就是,選擇第一個不是廣告的網站爲例
可以看到,選擇還是蠻多的,那麼我們就從這個網站上抓取一些代理IP來使用吧,它的網址結構是'http://www.xicidaili.com/nn/'+PageNumber,每頁有50個代理IP,可以很方便的用for循環來爬取所有代理IP。查看網頁源碼,發現所有的IP和端口都在<tr class="">下第二個和第三個td類下,結合BeautifulSoup可以很方便地抓取信息,源代碼如下
- import urllib2
- from bs4 import BeautifulSoup
- import csv
- def IPspider(numpage):
- csvfile = file('ips.csv', 'wb')
- writer = csv.writer(csvfile)
- url='http://www.xicidaili.com/nn/'
- user_agent='IP'
- headers={'User-agent':user_agent}
- for num in xrange(1,numpage+1):
- ipurl=url+str(num)
- print 'Now downloading the '+str(num*100)+' ips'
- request=urllib2.Request(ipurl,headers=headers)
- content=urllib2.urlopen(request).read()
- bs=BeautifulSoup(content,'html.parser')
- res=bs.find_all('tr')
- for item in res:
- try:
- temp=[]
- tds=item.find_all('td')
- temp.append(tds[1].text.encode('utf-8'))
- temp.append(tds[2].text.encode('utf-8'))
- writer.writerow(temp)
- except IndexError:
- pass
- #假設爬取前十頁所有的IP和端口
- IPspider(10)
- import socket
- def IPpool():
- socket.setdefaulttimeout(2)
- reader=csv.reader(open('ips.csv'))
- IPpool=[]
- for row in reader:
- proxy=row[0]+':'+row[1]
- proxy_handler=urllib2.ProxyHandler({"http":proxy})
- opener=urllib2.build_opener(proxy_handler)
- urllib2.install_opener(opener)
- try:
- html=urllib2.urlopen('http://www.baidu.com')
- IPpool.append([row[0],row[1]])
- except Exception,e:
- continue
- return IPpool