用scrapy爬取有用的免费的西刺代理

爬虫为什么要使用代理服务器?

可以总结为以下几点:

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

猜你喜欢

转载自blog.csdn.net/cai_cai_cai_1992/article/details/83217785