用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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值