同一个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