- Scrapy教程
- Scrapy - 主页
- Scrapy 基本概念
- Scrapy - 概述
- Scrapy - 环境
- Scrapy - 命令行工具
- Scrapy - 蜘蛛
- Scrapy - 选择器
- Scrapy - 项目
- Scrapy - 物品加载器
- Scrapy - 外壳
- Scrapy - 项目管道
- Scrapy - 饲料出口
- Scrapy - 请求和响应
- Scrapy - 链接提取器
- Scrapy-设置
- Scrapy - 异常
- Scrapy 现场项目
- Scrapy - 创建一个项目
- Scrapy - 定义一个项目
- Scrapy - 第一个蜘蛛
- Scrapy - 爬行
- Scrapy - 提取项目
- Scrapy - 使用项目
- Scrapy - 以下链接
- Scrapy - 抓取数据
- Scrapy 有用的资源
- Scrapy - 快速指南
- Scrapy - 有用的资源
- Scrapy - 讨论
Scrapy - 请求和响应
描述
Scrapy 可以使用Request和Response对象来抓取网站。请求对象通过系统,使用蜘蛛程序执行请求,并在返回响应对象时返回到请求。
请求对象
请求对象是生成响应的 HTTP 请求。它有以下类别 -
class scrapy.http.Request(url[, callback, method = 'GET', headers, body, cookies, meta, encoding = 'utf-8', priority = 0, dont_filter = False, errback])
下表显示了请求对象的参数 -
先生编号 | 参数及说明 |
---|---|
1 | 网址 它是一个指定 URL 请求的字符串。 |
2 | 打回来 它是一个可调用函数,使用请求的响应作为第一个参数。 |
3 | 方法 它是一个指定 HTTP 方法请求的字符串。 |
4 | 标头 它是一个带有请求标头的字典。 |
5 | 身体 它是一个具有请求正文的字符串或 unicode。 |
6 | cookie 它是一个包含请求 cookie 的列表。 |
7 | 元 它是一个包含请求元数据值的字典。 |
8 | 编码 它是一个包含用于对 URL 进行编码的 utf-8 编码的字符串。 |
9 | 优先事项 它是一个整数,调度程序使用优先级来定义处理请求的顺序。 |
10 | 不过滤 它是一个布尔值,指定调度程序不应过滤请求。 |
11 | 错误返回 它是一个可调用函数,当处理请求时出现异常时将被调用。 |
将附加数据传递给回调函数
当下载响应作为其第一个参数时,将调用请求的回调函数。
例如 -
def parse_page1(self, response): return scrapy.Request("http://www.something.com/some_page.html", callback = self.parse_page2) def parse_page2(self, response): self.logger.info("%s page visited", response.url)
如果您想将参数传递给可调用函数并在第二个回调中接收这些参数,则可以使用Request.meta属性,如下例所示 -
def parse_page1(self, response): item = DemoItem() item['foremost_link'] = response.url request = scrapy.Request("http://www.something.com/some_page.html", callback = self.parse_page2) request.meta['item'] = item return request def parse_page2(self, response): item = response.meta['item'] item['other_link'] = response.url return item
使用 errbacks 捕获请求处理中的异常
errback 是一个可调用函数,当处理请求时出现异常时将被调用。
以下示例演示了这一点 -
import scrapy from scrapy.spidermiddlewares.httperror import HttpError from twisted.internet.error import DNSLookupError from twisted.internet.error import TimeoutError, TCPTimedOutError class DemoSpider(scrapy.Spider): name = "demo" start_urls = [ "http://www.httpbin.org/", # HTTP 200 expected "http://www.httpbin.org/status/404", # Webpage not found "http://www.httpbin.org/status/500", # Internal server error "http://www.httpbin.org:12345/", # timeout expected "http://www.httphttpbinbin.org/", # DNS error expected ] def start_requests(self): for u in self.start_urls: yield scrapy.Request(u, callback = self.parse_httpbin, errback = self.errback_httpbin, dont_filter=True) def parse_httpbin(self, response): self.logger.info('Recieved response from {}'.format(response.url)) # ... def errback_httpbin(self, failure): # logs failures self.logger.error(repr(failure)) if failure.check(HttpError): response = failure.value.response self.logger.error("HttpError occurred on %s", response.url) elif failure.check(DNSLookupError): request = failure.request self.logger.error("DNSLookupError occurred on %s", request.url) elif failure.check(TimeoutError, TCPTimedOutError): request = failure.request self.logger.error("TimeoutError occurred on %s", request.url)
Request.meta 特殊键
request.meta特殊键是Scrapy识别的特殊元键的列表。
下表显示了 Request.meta 的一些键 -
先生编号 | 按键及说明 |
---|---|
1 | 不重定向 当设置为 true 时,它是一个关键,不会根据响应的状态重定向请求。 |
2 | 不要重试 当设置为 true 时,它是一个关键,不会重试失败的请求,并且将被中间件忽略。 |
3 | 句柄_httpstatus_list 它是定义每个请求可以允许哪些响应代码的关键。 |
4 | 句柄_httpstatus_all 它是一个键,用于通过将其设置为true来允许请求的任何响应代码。 |
5 | 不要合并cookie 这是一个键,用于通过将其设置为true来避免与现有 cookie 合并。 |
6 | cookie罐 它是用于为每个蜘蛛保留多个 cookie 会话的密钥。 |
7 | 不缓存 它是用于避免在每个策略上缓存 HTTP 请求和响应的密钥。 |
8 | 重定向网址 它是一个包含请求所通过的 URL 的键。 |
9 | 绑定地址 它是可用于执行请求的传出 IP 地址的 IP。 |
10 | 不要服从机器人txt 这是一个关键,当设置为 true 时,不会过滤 robots.txt 排除标准禁止的请求,即使启用了 ROBOTSTXT_OBEY 也是如此。 |
11 | 下载超时 它用于设置每个蜘蛛下载程序在超时之前等待的超时(以秒为单位)。 |
12 | 下载最大大小 它用于设置下载器将下载的每个蜘蛛的最大大小(以字节为单位)。 |
13 | 代理人 可以为Request对象设置Proxy来设置HTTP代理以供请求使用。 |
请求子类
您可以通过子类化请求类来实现您自己的自定义功能。内置请求子类如下 -
表单请求对象
FormRequest 类通过扩展基本请求来处理 HTML 表单。它有以下类别 -
class scrapy.http.FormRequest(url[,formdata, callback, method = 'GET', headers, body, cookies, meta, encoding = 'utf-8', priority = 0, dont_filter = False, errback])
以下是参数 -
formdata - 它是一个字典,具有分配给请求正文的 HTML 表单数据。
注意- 其余参数与请求类相同,并在请求对象部分中进行了解释。
除了请求方法之外,FormRequest对象还支持以下类方法-
classmethod from_response(response[, formname = None, formnumber = 0, formdata = None, formxpath = None, formcss = None, clickdata = None, dont_click = False, ...])
下表显示了上述类的参数 -
先生编号 | 参数及说明 |
---|---|
1 | 回复 它是一个用于使用 HTML 形式的响应预填充表单字段的对象。 |
2 | 表单名称 它是一个字符串,如果指定的话,将使用具有 name 属性的表单。 |
3 | 表格编号 当响应中有多种形式时,它是要使用的形式的整数。 |
4 | 表单数据 它是用于覆盖的表单数据中的字段字典。 |
5 | 表单路径 指定时它是一个字符串,使用与 xpath 匹配的形式。 |
6 | 表单CSS 指定时它是一个字符串,使用与 css 选择器匹配的形式。 |
7 | 点击数据 它是用于观察单击的控件的属性字典。 |
8 | 不要点击 当设置为 true 时,无需单击任何元素即可提交表单中的数据。 |
例子
以下是一些请求使用示例 -
使用 FormRequest 通过 HTTP POST 发送数据
以下代码演示了当您想在蜘蛛中复制 HTML 表单 POST 时如何返回FormRequest对象 -
return [FormRequest(url = "http://www.something.com/post/action", formdata = {'firstname': 'John', 'lastname': 'dave'}, callback = self.after_post)]
使用 FormRequest.from_response() 模拟用户登录
通常,网站使用提供预填充表单字段的元素。
当您希望在抓取时自动填充这些字段时,可以使用FormRequest.form_response ()方法。
以下示例演示了这一点。
import scrapy class DemoSpider(scrapy.Spider): name = 'demo' start_urls = ['http://www.something.com/users/login.php'] def parse(self, response): return scrapy.FormRequest.from_response( response, formdata = {'username': 'admin', 'password': 'confidential'}, callback = self.after_login ) def after_login(self, response): if "authentication failed" in response.body: self.logger.error("Login failed") return # You can continue scraping here
响应对象
它是一个指示 HTTP 响应的对象,该响应被提供给蜘蛛程序进行处理。它有以下类别 -
class scrapy.http.Response(url[, status = 200, headers, body, flags])
下表显示了 Response 对象的参数 -
先生编号 | 参数及说明 |
---|---|
1 | 网址 它是一个指定 URL 响应的字符串。 |
2 | 地位 它是一个包含 HTTP 状态响应的整数。 |
3 | 标头 它是一个包含响应标头的字典。 |
4 | 身体 它是一个带有响应主体的字符串。 |
5 | 旗帜 它是一个包含响应标志的列表。 |
响应子类
您可以通过子类化响应类来实现您自己的自定义功能。内置响应子类如下 -
文本响应对象
TextResponse 对象用于二进制数据,例如图像、声音等,它能够对基本 Response 类进行编码。它有以下类别 -
class scrapy.http.TextResponse(url[, encoding[,status = 200, headers, body, flags]])
以下是参数 -
编码- 它是一个带有编码的字符串,用于对响应进行编码。
注意- 其余参数与响应类相同,并在响应对象部分中进行了解释。
下表显示了除了响应方法之外 TextResponse 对象支持的属性 -
先生编号 | 属性及描述 |
---|---|
1 | 文本 它是一个响应主体,其中response.text可以被多次访问。 |
2 | 编码 它是一个包含响应编码的字符串。 |
3 | 选择器 它是在第一次访问时实例化的属性,并使用响应作为目标。 |
下表显示了除了响应方法之外TextResponse对象支持的方法-
先生编号 | 方法及说明 |
---|---|
1 | xpath(查询) 它是 TextResponse.selector.xpath(query) 的快捷方式。 |
2 | CSS(查询) 它是 TextResponse.selector.css(query) 的快捷方式。 |
3 | body_as_unicode() 它是一个可用作方法的响应正文,其中可以多次访问response.text。 |
HtmlResponse 对象
它是一个通过查看HTML的meta httpequiv属性来支持编码和自动发现的对象。它的参数与响应类相同,并在响应对象部分中进行了解释。它有以下类别 -
class scrapy.http.HtmlResponse(url[,status = 200, headers, body, flags])
XmlResponse 对象
它是一个支持编码和通过查看 XML 行自动发现的对象。它的参数与响应类相同,并在响应对象部分中进行了解释。它有以下类别 -
class scrapy.http.XmlResponse(url[, status = 200, headers, body, flags])