Scrapy 下载器中间件、请求和响应

Scrapy 下载器中间件、请求和响应,scrapy,Scrapy,我知道中间件会将请求传递给下载器,并将响应传递给爬行器,但是没有任何东西解释下载器中间件应该做什么,我在任何地方都找不到合适的解释 它的目的是什么?Downloader中间件用于修改请求和响应的方式有哪些?下载中间件是否用于处理异常、管理代理和用户代理字符串等?让我们以scrapy的文档中给出的示例为例 import scrapy class QuotesSpider(scrapy.Spider): name = "quotes" start_urls

我知道中间件会将请求传递给下载器,并将响应传递给爬行器,但是没有任何东西解释下载器中间件应该做什么,我在任何地方都找不到合适的解释


它的目的是什么?Downloader中间件用于修改请求和响应的方式有哪些?下载中间件是否用于处理异常、管理代理和用户代理字符串等?

让我们以scrapy的文档中给出的示例为例

import scrapy


class QuotesSpider(scrapy.Spider):
    name = "quotes"

    start_urls = [
        'http://quotes.toscrape.com/page/1/',
        'http://quotes.toscrape.com/page/2/',
    ]

    def parse(self, response):
        for quote in response.css('div.quote'):
            yield {
                'text': quote.css('span.text::text').extract_first(),
                'author': quote.css('small.author::text').extract_first(),
                'tags': quote.css('div.tags a.tag::text').extract(),
            }
好吧,它工作得很好,但正如你已经知道的,这不是所有的网站都是如此,比如amazon.com

您需要在请求头中发送用户代理(如Mozilla或Chrome),这样它就知道请求来自浏览器。通过替换USER_AGENT=“Mozilla/5.0(X11;Linux x86_64)AppleWebKit/537.36(KHTML,比如Gecko)Chrome/51.0.2704.103 Safari/537.36”,您可以轻松地从设置中更改它

现在您已经更改了用户代理,亚马逊的服务器将感觉请求来自chrome浏览器。更进一步,您将并发性增加到一些大的数字,比如100。现在,亚马逊可以很容易地跟踪你的机器人,你会被禁止,因为这意味着一台设备在一秒钟内访问服务器100次,这是人类不可能做到的

代理轮换和用户代理轮换。问题是我们如何旋转它们

假设您的设置中有一堆用户_代理=[…]

Middleware.py 从.settings导入用户\代理\列表 随机输入 从scrapy导入日志

class UserAgentRotationMiddleware(object):
 
    def process_request(self, request, spider):
        agent  = random.choice(USER_AGENT_LIST)
        if agent:
            request.headers.setdefault('User-Agent', agent)
你必须告诉这个卑鄙的项目

DOWNLOADER_MIDDLEWARES = {
   "yourproject.middlewares.UserAgentRotationMiddleware": 500
}
运行spider时实际会发生什么?

说明:

  • 我的日程安排很差
  • URL在请求到达服务器之前到达下载程序中间件
  • 从技术上讲,它将调用downloader中间件类,它调用process_request方法,提供当前的请求对象和spider对象

    def process_request(self, request, spider):
    
    现在您可以使用请求对象了,您可以用它做任何事情,比如更改头代理甚至url本身。但我们现在关注的是用户代理

    因此,通过我们的算法,我们将更改用户代理

    # Choosing random user agent from a list
    agent  = random.choice(USER_AGENT_LIST)
        if agent:
            request.headers.setdefault('User-Agent', agent)
    
    新的requestgetschedule再次来到这个中间件,它将更改用户代理,并将请求对象向前传递

    DOWNLOADER_MIDDLEWARES = {
       "yourproject.middlewares.UserAgentRotationMiddleware": 500
    }
    
    在注册我们的项目时,我们必须指定一些介于100到900之间的数字, 它表示什么?(作为中间件名称空间的值)

    在scrapy中已经存在许多不同的中间件,在这种情况下,我们也可以根据需要定义许多中间件 如何确定它们的优先级? 他们的执行顺序是什么

    它按升序执行,如100200230500650900

    同样的方法也适用于代理轮换

    请求:

    如果您使用了较低级别的urllib或requests模块,它会做什么? 它将url作为参数(cookie、代理、头、负载可选参数)

    当你运行它时,它的作用是什么? 它向url发出http请求“http://quotes.toscrape.com"

    就像您通常在浏览器中所做的那样:

  • 打开浏览器
  • 输入“http://quotes.toscrape.com“在url栏中
  • 您的浏览器显示该网站
  • 但在第二步和第三步之间,还有很多事情要做。 您的浏览器使用较低级别的http请求向服务器发送url请求。获取响应,然后将其编译并显示在浏览器中

    做同样事情的伪代码

    import requests
    
    response = requests.get('http://quotes.toscrape.com')
    
    print response.status_code
    print response.content
    
    请求。获取url“http://quotes.toscrape.com" 将HTTP GET请求发送到“http://quotes.toscrape.com“这将返回您的响应。您可以执行它并检查它,它将向我们返回一些html,这只是一个响应

    scrapy所做的只是提供它们的功能,它将这个请求模块包装在scrapy.Request和response模块中,并将其发送到HttpResponse

    HttpResponse提供xpath和css选择器

    def parse(self, response):
        response.xpath('....')
    

    这个解析方法中的scrapy框架在这里提供的响应是HttpResponse的一个实例,HttpResponse是低级urllib响应对象的包装器。

    我已经知道了很多,因为它在文档中。也许是我的错,因为我问题的标题有些模糊。我在问题底部提出的问题是:
    “下载器中间件的用途是什么?下载器中间件用于修改请求和响应的方式有哪些?下载器中间件用于处理异常、管理代理和用户代理字符串等?”
    您确实回答了其中一些问题,答案中有关于用户代理字符串和代理的部分。感谢您的努力如果您能详细阐述/阐述/进一步解释这些部分/主题,我将不胜感激。@Anthony如果您感兴趣,我可以向您展示我是如何利用它为我的利益服务的示例。当然!!让我们看看你的下载中间件!