Scrapy之下载中间件中的代理中间件HttpProxyMiddleware

简单的使用内置的代理中间件

 1 # -*- coding: utf-8 -*-
 2 import scrapy
 3 from wyb.items import WybItem
 4 from scrapy.dupefilters import RFPDupeFilter
 5 from scrapy.http.response.html import HtmlResponse
 6 from scrapy.http.cookies import CookieJar
 7 from urllib.parse import urlencode
 8 from scrapy.http import Request
 9 
10 
11 class ChoutiSpider(scrapy.Spider):
12     name = 'chouti'
13     # 爬取定向的网页 只允许这个域名的
14     allowed_domains = ['chouti.com']
15     start_urls = ['https://dig.chouti.com/']
16 
17     def start_requests(self):
18         import os
19         # 代理设置 downloadmiddleware中httppxoxy
20         os.environ['HTTP_PROXY'] = '1.1.1.2'
21         os.environ['HTTPS_PROXY'] = 'http://root:woshinizuzong@192.168.10.10:8888/'
22         # 方式1
23         for url in self.start_urls:
24             yield Request(url=url)
25         # 方式2
26         # req_list = []
27         # for url in self.start_urls:
28         #     req_list.append(Request(url=url))
29         # return req_list
30 
31     def parse(self, response):
32         """
33         第一次访问响应response
34         :param response:
35         :return:
36         """
37         page_list = response.xpath('//div[@id="dig_lcpage"]//a/@href').extract()
38         for page in page_list:
39             from scrapy.http import Request
40             page = "https://dig.chouti.com"+page
41             # 继续发请求,回调函数parse
42             yield Request(url=page, callback=self.parse, meta={"proxy": "http://root:woshinizuzong@192.168.10.10:8888/"})

 源码分析

 

 

 

 

  

 

 

 

 总结:

  如果要简单的使用只需在请求刚开始的时候定义os.environ进程环境变量

1         import os
2         # 代理设置 downloadmiddleware中httppxoxy
3         os.environ['HTTP_PROXY'] = '1.1.1.2'
4         os.environ['HTTPS_PROXY'] = 'http://root:woshinizuzong@192.168.10.10:8888/'
5 
6 
7      yield Request(url=page, callback=self.parse, meta={"proxy": "http://root:woshinizuzong@192.168.10.10:8888/"})   # meta优先级比environ更高

   如果要自定义下载代理中间件需要定义这些方法

 1 def __init__(self, auth_encoding='latin-1'):
 2 
 3 @classmethod
 4 def from_crawler(cls, crawler):
 5 
 6 def _basic_auth_header(self, username, password):
 7 
 8 def _get_proxy(self, url, orig_type):
 9 
10 def process_request(self, request, spider):
11 
12 def _set_proxy(self, request, scheme): 

自定义下载代理中间件方式一

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 import base64
 4 import random
 5 from six.moves.urllib.parse import unquote, urlunparse
 6 
 7 try:
 8     from urllib2 import _parse_proxy
 9 except ImportError:
10     from urllib.request import _parse_proxy
11 from scrapy.utils.python import to_bytes
12 
13 
14 class WybProxyMiddleware(object):
15 
16     def _basic_auth_header(self, username, password):
17         user_pass = to_bytes(
18             '%s:%s' % (unquote(username), unquote(password)),
19             encoding='latin-1')
20         return base64.b64encode(user_pass)
21 
22     def process_request(self, request, spider):
23         PROXIES = [
24             "http://root:woshinizuzong@192.168.10.10:8888/",
25             "http://root:woshinizuzong@192.168.10.11:8888/",
26             "http://root:woshinizuzong@192.168.10.12:8888/",
27             "http://root:woshinizuzong@192.168.10.13:8888/",
28             "http://root:woshinizuzong@192.168.10.14:8888/",
29             "http://root:woshinizuzong@192.168.10.15:8888/",
30         ]
31         # url = "http://root:woshinizuzong@192.168.10.10:8888/"
32         url = random.choice(PROXIES)
33         orig_type = ""
34         proxy_type, user, password, hostport = _parse_proxy(url)
35         proxy_url = urlunparse((proxy_type or orig_type, hostport, '', '', '', ''))
36 
37         if user:
38             creds = self._basic_auth_header(user, password)
39         else:
40             creds = None
41 
42         request.meta['proxy'] = proxy_url
43         if creds:
44             request.headers['Proxy-Authorization'] = b'Basic ' + creds

自定义下载代理中间件方式二,源码看了很轻松自己定义

 1 class ProxyMiddleware(object):
 2     def process_request(self, request, spider):
 3         PROXIES = [
 4             {'ip_port': '220.230.240.200:80', 'user_pass': 'woshinizuzong'},
 5             {'ip_port': '220.230.240.201:80', 'user_pass': 'woshinidie'},
 6             {'ip_port': '220.230.240.202:8888', 'user_pass': 'woshiniye'},
 7             {'ip_port': '220.230.240.203:80', 'user_pass': 'caonidaba'},
 8             {'ip_port': '220.230.240.204:80', 'user_pass': 'jiaowolaoba'},
 9             {'ip_port': '220.230.240.205:8888', 'user_pass': 'shuowodiaoda'},
10         ]
11         proxy = random.choice(PROXIES)
12         if proxy['user_pass'] is not None:
13             request.meta['proxy'] = to_bytes("http://%s" % proxy['ip_port'])
14             encoded_user_pass = base64.b64decode(to_bytes(proxy['user_pass']))
15             request.headers['Proxy-Authorization'] = to_bytes('Basic ' + encoded_user_pass)
16         else:
17             request.meta['proxy'] = to_bytes("http://%s" % proxy['ip_port'])

 配置文件中

 

 好奇看下Scrapy的配置文件

 

转载于:https://www.cnblogs.com/Alexephor/p/11440483.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Scrapy 项目的 settings.py 文件配置中间件的先后顺序为: 1. 先配置自定义中间件, 设置在 `DOWNLOADER_MIDDLEWARES` 和 `SPIDER_MIDDLEWARES` 2. 接着配置内置中间件 例如: ```python DOWNLOADER_MIDDLEWARES = { 'myproject.middlewares.MyCustomDownloaderMiddleware': 543, 'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware': None, 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware': 350, 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware': 400, 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': 500, 'scrapy.downloadermiddlewares.retry.RetryMiddleware': 550, 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware': 580, 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 590, 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware': 600, 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware': 700, 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 750, 'scrapy.downloadermiddlewares.stats.DownloaderStats': 850, 'scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware': 900, } SPIDER_MIDDLEWARES = { 'myproject.middlewares.MyCustomSpiderMiddleware': 543, 'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware': 50, 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware': 500, 'scrapy.spidermiddlewares.referer.RefererMiddleware': 700, 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware': 800, 'scrapy.spidermiddlewares.depth.DepthMiddleware': 900, } ``` 这里你可以看到在自定义中间件之后是默认的中间件,而且在配置时也会有优先级这么一个概念,数字越小优先级越高。 ### 回答2: 在Scrapy项目的settings.py文件,可以通过DOWNLOADER_MIDDLEWARES和SPIDER_MIDDLEWARES配置中间件的先后顺序。 DOWNLOADER_MIDDLEWARES是用于配置下载中间件的,该中间件可以通过修改请求和响应来拦截和处理请求和响应。可以通过修改settings.py的DOWNLOADER_MIDDLEWARES,设置列表的元素来确定中间件的顺序。列表的元素按照从高优先级到低优先级的顺序执行。可以通过修改元素的顺序来调整中间件的执行顺序。 SPIDER_MIDDLEWARES是用于配置爬虫中间件的,该中间件可以通过修改爬虫的输入和输出来拦截和处理爬虫的输入和输出数据。可以通过修改settings.py的SPIDER_MIDDLEWARES,设置列表的元素来确定中间件的顺序。列表的元素按照从高优先级到低优先级的顺序执行。可以通过修改元素的顺序来调整中间件的执行顺序。 例如,如果想要在下载中间件添加一个自定义的中间件,并希望它在其他中间件之前执行,可以将其添加到DOWNLOADER_MIDDLEWARES列表的第一个位置。如果想要在爬虫中间件添加一个自定义的中间件,并希望它在其他中间件之后执行,可以将其添加到SPIDER_MIDDLEWARES列表的最后一个位置。 通过调整中间件的先后顺序,可以灵活地处理请求和响应以及爬虫的输入和输出,实现特定的功能和逻辑。 ### 回答3: Scrapy是一个功能强大的Python爬虫框架,可以用于爬取和提取网页数据。在Scrapy中间件是一个流程处理器,可以对请求和响应进行预处理和后处理。通过在项目的settings.py文件进行配置,可以控制中间件的先后顺序。 在settings.py文件,有一个名为`DOWNLOADER_MIDDLEWARES`的配置项,它是一个字典,用于指定中间件及其优先级。 比如,我们可以将`DOWNLOADER_MIDDLEWARES`配置为: ```python DOWNLOADER_MIDDLEWARES = { 'myproject.middlewares.Middleware1': 543, 'myproject.middlewares.Middleware2': 544, 'myproject.middlewares.Middleware3': 545, } ``` 在这个例子,`myproject.middlewares.Middleware1`是第一个中间件,优先级为543。`myproject.middlewares.Middleware2`是第二个中间件,优先级为544。`myproject.middlewares.Middleware3`是第三个中间件,优先级为545。 Scrapy会按照优先级来执行中间件,从而达到预期的处理顺序。较小的优先级值会被优先执行。在上面的例子Middleware1总是会被最先执行,然后是Middleware2,最后是Middleware3。 当然,也可以通过修改优先级值来调整中间件的执行顺序。较小的优先级值会被先执行,较大的优先级值会被后执行。 总结来说,通过在项目的settings.py文件配置`DOWNLOADER_MIDDLEWARES`,可以调整Scrapy中间件的执行顺序,从而实现对请求和响应的定制化处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值