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

时间:2022-11-10 17:01:04

正如在上一篇博文中提到的那样,同一个IP针对一个网站短时间内大量的访问通常会导致IP被封,除了在爬取数据时增加延迟(爬取量不大或者对爬取速度没要求),还有一个好方法就是使用代理IP,这样就可以完美解决IP被封的问题。

那么,问题来了,代理的IP从哪儿来呢,土豪自然随意,直接淘宝买一些代理IP就好,稳定也不是特别贵。但对于技术爱好者,也许并没有那个需求,其实网上还是有很多免费的代理IP的,随意打开百度一搜就是,选择第一个不是广告的网站为例

Python爬虫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)
这样就爬到了1000个代理IP和端口,当然了,免费也有免费的坏处,那就是并不是所有的代理IP都可以用,所以我们需要检查一下哪些IP是可以使用的。如何检查该IP是否可用,我们就看连上代理后能不能在2秒内打开百度的页面,如果可以,则认为IP可用,添加到一个list里供后面备用,实现代码如下。

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
这样的话,就取得了一系列可用的IP代理,配合之前的爬虫使用,就不太容易出现IP被封的情况了,不过在目前这种情况下,验证IP所需要的时间太久,所以可以采用多线程或者多进程的方法来进一步提高效率,我会在下一篇写一个抓取所有职位的详细信息的爬虫中详细讲到。

当然,如果有更好的验证IP可用性的方法,请告诉我,我总觉得用打开网站的方法很蠢,而且效率也不高。


最近一段时间有点迷茫啊,不知道有没有读博的小伙伴有类似的经历或感觉,自己的课题导师一点也不上心,又不给你指导又不与你方便,整天让你按着他的想法去给他做一些工作,倒不是不愿意干活,我只想保证自己按时顺利毕业就行,别总拖着我啊,生气生气!!!