scrapy设置代理的方法

根据最新的scrapy官方文档,scrapy爬虫框架的代理配置有以下两种方法:

1.使用中间件DownloaderMiddleware进行配置

在settings.py文件中,找到DOWNLOADER_MIDDLEWARES它是专门用来用配置scrapy的中间件.我们可以在这里进行自己爬虫中间键的配置,配置后如下:

DOWNLOADER_MIDDLEWARES = {
    'WandoujiaCrawler.middlewares.ProxyMiddleware': 100,
}

其中WandoujiaCrawler是我们的项目名称,后面的数字代表中间件执行的优先级。

官方文档中默认proxy中间件的优先级编号是750,我们的中间件优先级要高于默认的proxy中间键。

中间件middlewares.py的写法如下(scrapy默认会在这个文件中写好一个中间件的模板,不用管它写在后面即可):

# -*- coding: utf-8 -*-
class ProxyMiddleware(object):
    def process_request(self, request, spider):
        request.meta['proxy'] = "http://proxy.yourproxy:8001"

这里有两个注意的问题:

  • 1.是proxy一定是要写成 http:// 前缀,否则会出现to_bytes must receive a unicode, str or bytes object, got NoneType的错误.

  • 2.是官方文档中写到process_request方法一定要返回request对象,response对象或None的一种,但是其实写的时候不用return,乱写可能会报错。另外如果代理有用户名密码等就需要在后面再加上一些内容:

# Use the following lines if your proxy requires authentication
proxy_user_pass = "USERNAME:PASSWORD"
# setup basic authentication for the proxy
encoded_user_pass = base64.encodestring(proxy_user_pass)
request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass

此处配置参考:
http://www.pythontab.com/html/2014/pythonweb_0326/724.html

2.直接在爬虫程序中设置proxy字段

我们可以直接在自己具体的爬虫程序中设置proxy字段,代码如下,直接在构造Request里面加上meta字段即可:

class QuotesSpider(scrapy.Spider):
    name = "quotes"
    def start_requests(self):
        urls = [
            'http://quotes.toscrape.com/page/1/',
            'http://quotes.toscrape.com/page/2/',
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse, 
            meta={'proxy': 'http://proxy.yourproxy:8001'})
 
    def parse(self, response):
        for quote in response.css('div.quote'):
            yield {
                'text': quote.css('span.text::text').extract_first(),
                'author': quote.css('span small::text').extract_first(),
                'tags': quote.css('div.tags a.tag::text').extract(),
            }

3:通过内置的环境变量

这是在我们的start_request里面,代码如下:(该方法比较low ,不推荐使用)

  def start_requests(self):
    	# 这里是代理ip
        import os
        os.environ["HTTPS_PROXY"] = '37.187.149.129:1080'
        os.environ["HTTP_PROXY"] = '202.29.212.213:443'
        # 重写了start_requests一定要重写这个不然不能爬取了。
        #方法一:
        #for url in self.start_urls:
         #   yield Request(url=url)
         # 方法二:
        request_list = []
        for url in self.start_urls:
            request_list.append(Request(url=url))
        return request_list

提示一下:meta的优先级要高于环境变量的。

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Scrapy设置代理需要通过 middleware 来实现。以下是一个简单的隧道代理设置示例: 1. 创建一个自定义的 middleware,命名为 `RandomProxyMiddleware`,并将其添加到 Scrapy 的 settings.py 中: ```python from scrapy import signals import random class RandomProxyMiddleware(object): def __init__(self, settings): self.proxies = settings.getlist('PROXIES') @classmethod def from_crawler(cls, crawler): return cls(crawler.settings) def process_request(self, request, spider): request.meta['proxy'] = random.choice(self.proxies) ``` 2. 在 settings.py 中添加以下配置: ```python PROXIES = [ 'http://user:password@proxy1.example.com:8080', 'http://user:password@proxy2.example.com:8080', # ... ] DOWNLOADER_MIDDLEWARES = { 'myproject.middlewares.RandomProxyMiddleware': 543, 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 544, } ``` 在这个示例中,我们创建了一个自定义的 middleware `RandomProxyMiddleware`,它会从 `PROXIES` 列表中随机选择一个代理,并将其设置为 request 的 meta 属性中的 `proxy` 字段。同时,我们还将 Scrapy 自带的 `HttpProxyMiddleware` 添加到了 middleware 列表中,以便 Scrapy 使用我们设置代理。最后,我们将这两个 middleware 的优先级分别设置为 543 和 544,以确保 `RandomProxyMiddleware` 先于 `HttpProxyMiddleware` 执行。 3. 运行 Scrapy 爬虫时,所有的请求都会通过 `RandomProxyMiddleware` 中设置代理进行发送。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值