一些网站会有相应的反爬虫措施,例如不少网站会检测某一段时间某个IP的访问次数,若是访问频率太快以致于看起来不像正常访客,它可能就会会禁止这个IP的访问。因此咱们须要设置一些代理服务器,每隔一段时间换一个代理,就算IP被禁止,依然能够换个IP继续爬取。
在Python中,可使用urllib2中的ProxyHandler来设置使用代理服务器,下面经过代码说明如何来使用代理:html
import urllib2 # 构建了两个代理Handler,一个有代理IP,一个没有代理IP httpproxy_handler = urllib2.ProxyHandler({"http" : "124.88.67.81:80"}) nullproxy_handler = urllib2.ProxyHandler({}) #定义一个代理开关 proxySwitch = True # 经过 urllib2.build_opener()方法使用这些代理Handler对象,建立自定义opener对象 # 根据代理开关是否打开,使用不一样的代理模式 if proxySwitch: opener = urllib2.build_opener(httpproxy_handler) else: opener = urllib2.build_opener(nullproxy_handler) request = urllib2.Request("http://www.baidu.com/") # 使用opener.open()方法发送请求才使用自定义的代理,而urlopen()则不使用自定义代理。 response = opener.open(request) # 就是将opener应用到全局,以后全部的,无论是opener.open()仍是urlopen() 发送请求,都将使用自定义代理。 # urllib2.install_opener(opener) # response = urlopen(request) print response.read()
上面使用的是免费的开放代理,咱们能够在一些代理网站上收集这些免费代理,测试后若是能够用,就把它收集起来用在爬虫上面。服务器
免费代理网站:dom
西刺免费代理测试
快代理免费代理网站
全国代理ipui
若是你有足够多的代理,能够放在一个列表中,随机选择一个代理去访问网站。以下:url
import urllib2 import random proxy_list = [ {"http" : "124.88.67.81:80"}, {"http" : "124.88.67.81:80"}, {"http" : "124.88.67.81:80"}, {"http" : "124.88.67.81:80"}, {"http" : "124.88.67.81:80"} ] # 随机选择一个代理 proxy = random.choice(proxy_list) # 使用选择的代理构建代理处理器对象 httpproxy_handler = urllib2.ProxyHandler(proxy) opener = urllib2.build_opener(httpproxy_handler) request = urllib2.Request("http://www.baidu.com/") response = opener.open(request) print response.read()
上面使用的都是免费代理,不是很稳定,不少时候会出现没法使用的状况,这时候能够考虑使用私密代理。也就是向代理供应商购买代理,供应商会提供一个有效代理,而且有本身的用户名和密码,具体使用和免费代理同样,这是多了一个帐户认证,以下:spa
# 构建具备一个私密代理IP的Handler,其中user为帐户,passwd为密码 httpproxy_handler = urllib2.ProxyHandler({"http" : "user:passwd@124.88.67.81:80"})
上面就是使用urllib2设置代理的方法,不过看起来有些麻烦,下面咱们看看如何使用reqursts来使用代理。代理
使用免费代理:code
import requests # 根据协议类型,选择不一样的代理 proxies = { "http": "http://12.34.56.79:9527", "https": "http://12.34.56.79:9527", } response = requests.get("http://www.baidu.com", proxies = proxies) print response.text
使用私密代理:
import requests # 若是代理须要使用HTTP Basic Auth,可使用下面这种格式: proxy = { "http": "mr_mao_hacker:sffqry9r@61.158.163.130:16816" } response = requests.get("http://www.baidu.com", proxies = proxy) print response.text
这样看起来简单很多。
注:能够将帐户密码写入环境变量以避免泄露