scrapy 代理

简介: 说明:本文参照了官网文档,以及stackoverflow的几个问题概要:在scrapy中使用代理,有两种使用方式使用中间件直接设置Request类的meta参数方式一:使用中间件要进行下面两步操作在文件 settings.

说明
本文参照了官网文档,以及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,    # 注意修改 project_name
    '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

延伸阅读

1.阅读官网文档对Request类的描述,我们可以发现除了设置proxy,还可以设置method, headers, cookies, encoding等等:

class scrapy.http.Request(url[, callback, method='GET', headers, body, cookies, meta, encoding='utf-8', priority=0, dont_filter=False, errback])

2.官网文档对Request.meta参数可以设置的详细列表:

  • dont_redirect
  • dont_retry
  • handle_httpstatus_list
  • handle_httpstatus_all
  • dont_merge_cookies (see cookies parameter of Request constructor)
  • cookiejar
  • dont_cache
  • redirect_urls
  • bindaddress
  • dont_obey_robotstxt
  • download_timeout
  • download_maxsize
  • proxy

如随机设置请求头和代理:

# my_spider.py

import random

# 事先收集准备的代理池
proxy_pool = [
    'http://proxy_ip1:port', 
    'http://proxy_ip2:port',
     ..., 
    'http://proxy_ipn:port'
]

# 事先收集准备的 headers
headers_pool = [
    {'User-Agent': 'Mozzila 1.0'},
    {'User-Agent': 'Mozzila 2.0'},
    {'User-Agent': 'Mozzila 3.0'},
    {'User-Agent': 'Mozzila 4.0'},
    {'User-Agent': 'Chrome 1.0'},
    {'User-Agent': 'Chrome 2.0'},
    {'User-Agent': 'Chrome 3.0'},
    {'User-Agent': 'Chrome 4.0'},
    {'User-Agent': 'IE 1.0'},
    {'User-Agent': 'IE 2.0'},
    {'User-Agent': 'IE 3.0'},
    {'User-Agent': 'IE 4.0'},
]


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:
            headers = random.choice(headers_pool) # 随机选一个headers
            proxy_addr = random.choice(proxy_pool) # 随机选一个代理
            yield scrapy.Request(url, callback=self.parse, headers=headers, meta={'proxy': proxy_addr})
            
    
    def parse(self, response):
        # doing parse
目录
相关文章
|
SQL 安全 关系型数据库
supersqli(SQL注入流程及常用SQL语句)
supersqli(SQL注入流程及常用SQL语句)
394 0
|
传感器 监控 物联网
golang开源的可嵌入应用程序高性能的MQTT服务
golang开源的可嵌入应用程序高性能的MQTT服务
773 3
|
11月前
|
存储 监控 数据可视化
从繁琐到高效:数字化工具助力HR管理的实际案例
随着数字化转型加速,人力资源管理(HRM)正经历深刻变革。传统纸质记录和手动流程逐渐被数字化工具取代,提升了效率并带来全新管理模式。本文探讨了看板工具、HR管理系统等如何改变传统HRM模式,并重点介绍了板栗看板的独特价值,包括任务可视化、跨部门协作、自定义功能、数据驱动决策及移动端支持,助力企业优化流程、提升效率和员工体验。
|
8月前
|
机器学习/深度学习 弹性计算 固态存储
2025年阿里云服务器租用价格参考:云服务器ECS最新收费标准及活动价格表
2025年,阿里云服务器ECS的租用价格再次迎来更新,1月22日12:00开始,阿里云又开启新一轮的降价政策,部分实例规格的云服务器收费标准有所变化,同时为了进一步降低了用户上云的成本,阿里云还会不定期推出各种活动。现在月付和年付租用阿里云服务器均有优惠了,本文为大家整理汇总了截止目前阿里云服务器最新的租用收费标准及活动价格表,以供了解与参考选择。
3508 10
Axure 表格中根据条件设置不同的字体样式--中继器
Axure 表格中根据条件设置不同的字体样式--中继器
253 0
|
SQL 数据处理 数据库
SQL语句优化与查询结果优化:提升数据库性能的实战技巧
在数据库管理和应用中,SQL语句的编写和查询结果的优化是提升数据库性能的关键环节
1151 0
|
监控
探索ERP系统的实施流程与方法论
探索ERP系统的实施流程与方法论
1824 2
|
缓存 前端开发 UED
前端 8 种图片加载优化方案梳理
本文首发于微信公众号“前端徐徐”,详细探讨了现代网页设计中图片加载速度优化的重要性及方法。内容涵盖图片格式选择(如JPEG、PNG、WebP等)、图片压缩技术、响应式图片、延迟加载、CDN使用、缓存控制、图像裁剪与缩放、Base64编码等前端图片优化策略,旨在帮助开发者提升网页性能和用户体验。
2845 0
|
NoSQL 关系型数据库 MySQL
8款优秀的MYSQL管理工具与应用程序推荐
8款优秀的MYSQL管理工具与应用程序推荐
1553 1
8款优秀的MYSQL管理工具与应用程序推荐
|
前端开发 JavaScript Java
SpringBoot水果商城后台管理系统(文末附源码)
🍅程序员小王的博客:程序员小王的博客 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 🍅java自学的学习路线:java自学的学习路线
558 0
SpringBoot水果商城后台管理系统(文末附源码)