爬虫为什么要使用代理服务器?
可以总结为以下几点:
1.我们在使用python爬虫爬取一个网站时,通常会频繁访问该网站。网站的反爬虫技术就会检某一段时间某个IP的访问次数,如果
访问次数过多,它就会禁用你的IP,所以我们可以设置一些代理服务器来帮助你做工作,每隔一段时间换一个代理,这样便不会出
现因为频繁访问而导致禁止访问的现象。
2.由于网络环境因素,直爬取速度太慢,但我们访问代理速度比较快,代理访问目标网站速度也比较快,所以我们使用代理提高爬
取速度。
3.由于某些地方法律或政治原因,某些网站无法直接访问,使用代理绕开访问限制。
闲言少叙,来看scrapy如何爬取能用的西刺代理。
# -*- coding: utf-8 -*-
import scrapy
import json
#高匿代理
class ProxySpider(scrapy.Spider):
name = 'proxy'
allowed_domains = ['www.xicidaili.com']
start_urls = ['http://www.xicidaili.com/nn/%s' % i for i in range(1,6)]
def parse(self, response):
#position()>1 获取tr标签位置大于1的标签
for sel in response.css('table#ip_list').xpath('.//tr[position()>1]'):
# nth-child(2)获取第二个子标签 (注意这里的顺序从1开始)
ip = sel.css('td:nth-child(2)::text').extract_first() #ip
port = sel.css('td:nth-child(3)::text').extract_first() #端口
scheme = sel.css('td:nth-child(6)::text').extract_first() #类型HTTP,https
# 拼接代理url
proxy = '%s://%s:%s' % (scheme,ip,port)
# 定义json数据 meta 文本
meta = {
'proxy':proxy,
'dont_retry':True, #只下载一次,失败不重复下载
'download_timeout':10, # 设置等待时间
'_proxy_ip':ip,
'_proxy_scheme':scheme
}
#校验代理是否可用 通过访问httpbin.org/ip,进行检测
url = '%s://httpbin.org/ip' % scheme
yield scrapy.Request(url,callback=self.check,meta=meta,dont_filter=True)
def check(self,response):
proxy_ip = response.meta['_proxy_ip']
proxy_scheme = response.meta['_proxy_scheme']
#json.loads()将json文本返回字典类型 origin原代理
if json.loads(response.text)['origin'] == proxy_ip:
yield {
'proxy':response.meta['proxy'],
'scheme':proxy_scheme,
}
运行爬虫时,将爬取到的内容放到json文件中,留作后用。
scrapy crawl proxy -o proxy_list.json