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,    # 注意修改 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
本文转自罗兵博客园博客,原文链接:http://www.cnblogs.com/hhh5460/p/5824786.html ,如需转载请自行联系原作者
相关文章
|
9月前
|
数据采集 Python
使用 asyncio 提升 Scrapy 爬虫框架的异步编程效能,并集成代理功能
异步编程在现代软件开发中扮演着越来越重要的角色,特别是在网络爬虫等需要处理大量 I/O 操作的场景中。本文将介绍 asyncio 这个强大的异步编程库,并探讨如何在 Scrapy 爬虫框架中充分利用 asyncio 提升爬虫的效率和灵活性。此外,还将介绍如何集成爬虫代理功能,进一步提高爬虫的效率和稳定性。
122 0
使用 asyncio 提升 Scrapy 爬虫框架的异步编程效能,并集成代理功能
|
Python
Scrapy添加代理验证
Scrapy添加代理验证
69 0
Python之scrapy的post请求、日志和代理
Python之scrapy的post请求、日志和代理
Python之scrapy的post请求、日志和代理
|
Python
Requests 和 Scrapy 添加动态IP代理
Requests 和 Scrapy 添加动态IP代理
332 0
|
数据采集 JSON API
新手教程 | Python Scrapy框架HTTP代理的配置与调试
做过python爬虫的都知道,HTTP代理的设置时要在发送请求前设置好,那HTTP代理的逻辑点在哪里呢?实际上,只需要在Scrapy 的项目结构中添加就好
新手教程 | Python Scrapy框架HTTP代理的配置与调试
|
Python
Scrapy添加代理验证
Scrapy添加代理验证
58 0
|
Python
Scrapy添加代理验证
Scrapy添加代理验证
109 0
|
数据采集 NoSQL Redis
Scrapy使用代理爬取网站
timg.jpg 前言 在我们平时使用爬虫程序采集数据时,往往会遇到,因采集速度过快导致的自己网络ip被目标网站封禁,这种封禁有时候是封几分钟,有时候是封一天,封的时间不等,但是这样会导致我们局域网内其他人也无法访问目标网站,最大的问题是我们无法进行数据采集。
1690 0
|
数据采集 中间件 Python
目标反爬虫怎么办?实践出真知-scrapy集成动态ip代理(以阿布云为例)
360截图20180712215548501.jpg 一、前言 在爬虫行当,每天都要面对目标反爬虫技术,我们想要拿到数据,就需要针对它们的反爬虫来制定绕过方法,比如它识别你的UserAgent,那你可能就需要伪造、它限制IP请求次数,你可能就需要限速或者改变ip、它用验证码来识别你是人是机,你就需要模拟人的操作并且正确填写它给你弹出的验证码等等。
2563 0
|
存储 关系型数据库 数据库
scrapy爬取免费代理IP存储到数据库构建自有IP池
以抓取西刺代理网站的高匿IP并存储到mysql数据库为例 西刺网:http://www.xicidaili.com/nn/ 运行环境:scrapy1.0.3 python2.7.10 需要安装MySQLdb模块  pip install mysql-python spider的编写步骤:.
3017 0