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时实际会发生什么?
说明:
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"
就像您通常在浏览器中所做的那样:
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如果您感兴趣,我可以向您展示我是如何利用它为我的利益服务的示例。当然!!让我们看看你的下载中间件!