scrapy 代理

scrapy 代理

说明
本文参照了官网文档,以及stackoverflow的几个问题

概要
在scrapy中使用代理,有两种使用方式

  1. 使用中间件
  2. 直接设置Request类的meta参数

方式一:使用中间件

要进行下面两步操作

  1. 在文件 settings.py 中激活代理中间件ProxyMiddleware
  2. 在文件 middlewares.py 中实现类ProxyMiddleware

1.文件 settings.py 中:

# settings.py 
DOWNLOADER_MIDDLEWARES = {'project_name.middlewares.ProxyMiddleware': 100, 
'scrapy.downloadermiddleware.httpproxy.HttpProxyMiddleware': 110, }

说明
数字100, 110表示中间件先被调用的次序。数字越小,越先被调用。
官网文档:The integer values you assign to classes in this setting determine the order in which they run: items go through from lower valued to higher valued classes. It’s customary to define these numbers in the 0-1000 range.

 

2.文件 middlewares.py 看起来像这样:

代理不断变换

  • 这里利用网上API 直接get过来。(需要一个APIKEY,免费注册一个账号就有了。这个APIKEY是我自己的,不保证一直有效!
  • 也可以从网上现抓。
  • 还可以从本地文件读取
  • # middlewares.py
    
    import requests
    
    class ProxyMiddleware(object):
    
        def process_request(self, request, spider):
            APIKEY = 'f95f08afc952c034cc2ff9c5548d51be'
            url = 'https://www.proxicity.io/api/v1/{}/proxy'.format(APIKEY) # 在线API接口
            r = requests.get(url)
    
            request.meta['proxy'] = r.json()['curl'] # 协议://IP地址:端口(如 http://5.39.85.100:30059)
            return request

     

  • 方式二:直接设置Request类的meta参数

  • import random
    
    # 事先准备的代理池
    proxy_pool = ['http://proxy_ip1:port', 'http://proxy_ip2:port', ..., 'http://proxy_ipn:port']
    
    
    class MySpider(BaseSpider):
        name = "my_spider"
        
        allowed_domains = ["example.com"]
        
        start_urls = [
            'http://www.example.com/articals/',
        ]
    
        def start_requests(self):
            for url in self.start_urls:
                proxy_addr = random.choice(proxy_pool) # 随机选一个
                yield scrapy.Request(url, callback=self.parse, meta={'proxy': proxy_addr}) # 通过meta参数添加代理
                
        
        def parse(self, response):
            # doing parse

     

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值