请求和回应

Scrapy使用RequestResponse对象来抓取网站。

通常,Request对象在蜘蛛中生成,并通过系统,直到它们到达执行请求的Downloader,并返回一个Response对象,该对象返回发出请求的蜘蛛。

RequestResponse类都有子类,它们添加基类中不需要的功能。这些在以下描述在Request子类Response子类中

请求对象

scrapy.http.

Request

url

[

callback

method ='GET'

headers

body

cookies

meta

encoding ='utf-8'

priority = 0

dont_filter = False

errback

flags

]

Request对象表示一个HTTP请求,通常是由Spider生成并由Downloader执行的,因此生成一个Response

参数: urlstring) - 此请求的URLcallbackcallable) - 将使用此请求的响应(一旦下载)作为其第一个参数调用的函数。有关更多信息,请参阅将附加数据传递给下面的回调函数。如果请求没有指定回调,则将使用spider的parse()方法。请注意,如果在处理期间引发异常,则调用errback。methodstring) - 此请求的HTTP方法。默认为'GET'metadict) -Request.meta属性的初始值。如果给出,则在此参数中传递的dict将被复制。bodystr或unicode) - 请求体。如果unicode被传递,则使用传递的编码(默认为utf-8)将其编码为str。如果没有给出body,则存储一个空字符串。不管此参数的类型如何,存储的最终值将是一个str(从不是unicodeNone)。headersdict) - 此请求的头文件。dict值可以是字符串(对于单值头)或列表(对于多值头)。如果None作为值传递,则HTTP头将不会被发送。cookiesdict或list) -请求cookie。这些可以两种形式发送。使用dict:request_with_cookies=Request(url=“http://www.example.com”,cookies={'currency':'USD','country':'UY'})使用名单:request_with_cookies=Request(url=“http://www.example.com”,cookies=[{'name':'currency','价值':'美元''domain':'example.com','path':'/](http://www.example.com”,cookies={'currency':'USD','country':'UY'})使用名单:requestwith_cookies=Request(url=“http://www.example.com”,cookies=[{'name':'currency','价值':'美元''domain':'example.com','path':'/) currency'}])后一种形式允许自定义cookie的domainpath属性。这只有在保存cookie以供以后请求时才有用。当某些网站返回cookie(在响应中),这些cookie存储在该域的cookie中,并将在以后的请求中再次发送。这是任何常规网络浏览器的典型行为。但是,如果由于某些原因,您希望避免与现有Cookie合并,则可以通过在Request.metadont_merge_cookies键设置为True来指示Scrapy。不合并Cookie的请求示例:request_with_cookies=Request(url=“[http://www.example.com”,cookies={'currency':'USD','country':'UY'},meta={'dont\_merge\_cookies':True})欲了解更多信息,请参阅\[CookiesMiddleware\]\(https://docs.scrapy.org/en/latest/topics/downloader-middleware.html\)。\*\*encoding\*\*(\_string\) - 该请求的编码(默认为'utf-8')。该编码将用于对URL进行百分比编码,并将主体转换为str(如果以unicode给出)。priorityint) - 此请求的优先级(默认为0)。调度程序使用优先级来定义用于处理请求的顺序。具有较高优先级值的请求将更早执行。允许负值表示相对较低的优先级。dont_filterboolean) - 表示该请求不应由调度程序过滤。当您要多次执行相同的请求时使用此选项,以忽略重复的过滤器。小心使用,否则您将进入爬行循环。默认为Falseerrbackcallable) - 一个在处理请求时发生任何异常时调用的函数。这包括失败的页面,404 HTTP错误等。它收到一个Twisted Failure实例作为第一个参数。有关更多信息,请参阅使用errbacks在下面的请求处理捕获异常flagslist) - 发送到请求的标志,可以用于日志记录或类似目的。

url

包含此请求的URL的字符串。请记住,此属性包含转义的URL,因此它可能与构造函数中传递的URL不同。

此属性为只读。要更改请求的URL,请使用replace()

method

表示请求中的HTTP方法的字符串。这是保证是大写的。示例:"GET""POST""PUT"

headers

包含请求标头的类似字典的对象。

body

包含请求体的str。

此属性为只读。要更改请求的正文,请使用replace()

meta

一个包含此请求的任意元数据的dict。这个dict对于新的请求是空的,通常由不同的Scrapy组件(扩展,中间件等)填充。因此,此dict中包含的数据取决于您启用的扩展。

请参阅Request.meta特殊键以获得Scrapy识别的特殊元键列表。

当使用copy()replace()方法克隆请求时,这个dict很复杂,也可以在你的蜘蛛中从response.meta属性中访问。

copy

返回新请求,该请求是该请求的副本。另请参阅:将附加数据传递给回调函数

replace

[

url

method

headers

body

cookies

meta

encoding

dont_filter

callback

errback

]

返回具有相同成员的Request对象,除了那些通过指定了哪个关键字参数赋予新值的成员。默认情况下复制Request.meta属性(除非在meta参数中给出了一个新值)。另请参见将附加数据传递给回调函数

传递附加数据到回调函数

请求的回调是当下载该请求的响应时将被调用的函数。将使用下载的Response对象作为其第一个参数来调用回调函数。

例:

def
parse_page1
(
self
,
response
):
返回
刮
。
请求
(
“http://www.example.com/some_page.html”
,
回调
=
自我
parse_page2
)
def
parse_page2
(
self
,
response
):
#这将记录http://www.example.com/some_page.html
自我
记录器
info
(
“Visited
%s
”
,
response。url
)

在某些情况下,您可能有兴趣将参数传递给这些回调函数,以便稍后在第二个回调中接收参数。您可以使用Request.meta属性。

以下是使用此机制传递项目的示例,以填充不同页面中的不同字段:

def
parse_page1
(
self
,
response
):
item
=
MyItem
()
item
[
'main_url'
]
=
响应
。
网址
请求
=
刮擦
。
请求
(
“http://www.example.com/some_page.html”
,
回调
=
自我
parse_page2
)
请求
meta
[
'item'
]
=
item
产量
要求
def
parse_page2
(
self
,
response
):
item
=
response
。
元
[
'item'
]
item
[
'other_url'
]
=
响应
。
网址
收益
项目

使用errbacks在请求处理中捕获异常

请求的错误是在处理异常时被调用的函数。

它收到一个Twisted Failure实例作为第一个参数,可用于跟踪连接建立超时,DNS错误等。

这是一个示例,蜘蛛记录所有错误,并在需要时捕获一些特定的错误:

进口
刮板
从
scrapy.spidermiddlewares.httperror
导入
HttpError
来自
twisted.internet.error
import
DNSLookupError
从
twisted.internet.error
导入
TimeoutError
,
TCPTimedOutError
类
ErrbackSpider
(
scrapy。Spider
):
name
=
“errback_example”
start_urls
=
[
“http://www.httpbin.org/”,#HTTP
200预计
“http://www.httpbin.org/status/404”,#
找不到错误
“http://www.httpbin.org/status/500”,#
服务器问题
“http://www.httpbin.org:12345/”,#
无响应主机,超时预期
“http://www.httphttpbinbin.org/”,#DNS
错误预期
]
def
start_requests
(
self
):
为
你
自己
start_urls
:
产生
刮伤
。
请求
(
u
,
callback
=
self。parse_httpbin
,
errback
=
self
。
errback_httpbin
,
dont_filter
=
True
)
def
parse_httpbin
(
self
,
response
):
自我
记录器
info
(
“从
{}
获得成功的答复
”
format
(
response。url
))
#在这里做一些有用的事情
def
errback_httpbin
(
self
,
failure
):
#记录所有失败
自我
记录器
错误
(
repr
(
failure
))
#如果你想为某些错误做一些特别的事情,
#你可能需要失败的类型:
如果
失败
。
检查
(
HttpError
):
#这些异常来自HttpError蜘蛛中间件
#你可以得到非200的响应
响应
=
失败
。
价值
。
响应
自我
记录器
error
(
'HttpError on
%s
'
,
response。url
)
精灵
失败
检查
(
DNSLookupError
):
#这是原始请求
请求
=
失败
。
请求
自我
记录器
错误
(
'
%s
'
上的DNSLookupError
,
请求
。url
)
精灵
失败
check
(
TimeoutError
,
TCPTimedOutError
):
请求
=
失败
。
请求
自我
记录器
错误
(
'
%s
上的TimeoutError
'
,
请求
。url
)

Request.meta特殊键

Request.meta属性可以包含任意数据,但是还有一些由Scrapy及其内置扩展识别的特殊键。

那些是:

bindaddress¶

用于执行请求的出站IP地址的IP。

download_timeout¶

下载器在超时前等待的时间(以秒为单位)。参见:DOWNLOAD_TIMEOUT

download_latency¶

自从请求已经启动(即通过网络发送的HTTP消息)获取响应所花费的时间。该元密钥只有在下载响应时才可用。虽然大多数其他元键用于控制Scrapy行为,但是这个应用程序应该是只读的。

download_fail_on_dataloss¶

是否在失败的响应失败。请参阅:DOWNLOAD_FAIL_ON_DATALOSS

max_retry_times¶

元密钥用于每个请求的重试次数。初始化时,max_retry_times元键的优先级高于RETRY_TIMES设置。

请求子类

这是内建的Request子类的列表。您也可以将其子类化以实现您自己的自定义功能。

FormRequest对象

FormRequest类扩展了基本Request,具有处理HTML表单的功能。它使用lxml.html表单预先填写表单数据,并从Response对象中输入表单数据。

scrapy.http.

FormRequest

url

[

formdata

...

]

FormRequest类向构造函数添加一个新参数。其余的参数与Request类相同,这里没有记录。

参数: formdatadict或iterable的元组) - 是包含HTML表单数据的字典(或(key,value)元组),它将被url编码并分配给请求的正文。

除了标准的Request方法之外,FormRequest对象还支持以下类方法:

classmethod

from_response

response

[

formname = None

formid = None

formnumber = 0

formdata = None

formxpath = None

formcss = None

clickdata = None

dont_click = False

...

]

返回一个新的FormRequest对象,其表单字段值预先填充在给定响应中包含的HTML<form>元素中。有关示例,请参阅使用FormRequest.from_response()来模拟用户登录

该策略是默认情况下自动模拟任何可以点击的表单控件,如<inputtype="submit">。即使这是非常方便的,通常是期望的行为,有时它可能会导致难以调试的问题。例如,当使用使用javascript填充和/或提交的表单时,默认的from_response()行为可能不是最合适的。要禁用此行为,您可以将dont_click参数设置为True。此外,如果要更改点击的控件(而不是禁用它),还可以使用clickdata参数。

警告

在选项值中使用具有前导或尾随空白的select元素的这种方法将不能工作,因为lxml中错误,应在lxml 3.8及更高版本中修复。

参数: responseResponse对象) - 包含HTML表单的响应,用于预填充表单字段formnamestring) - 如果给定,将使用name属性设置为此值的表单。formidstring) - 如果给定,将使用id属性设置为此值的表单。formxpathstring) - 如果给定,将使用与xpath匹配的第一个表单。formcssstring) - 如果给定,将使用与css选择器匹配的第一个表单。formnumberinteger) - 要使用的表单数,当响应包含多个表单时。第一个(也是默认)是0formdatadict) - 要在表单数据中覆盖的字段。如果一个字段已经存在于响应<form>元素中,则该值将被该参数传递的值覆盖。如果此参数中传递的值为None,则该字段将不会包含在请求中,即使它存在于响应<form>元素中。clickdatadict) - 查找点击的控件的属性。如果没有给出,表单数据将被提交,模拟对第一个可点击元素的点击。除了html属性之外,控件可以通过其基于零的索引相对于窗体内的其他可提交输入通过nr属性来标识。dont_clickboolean) - 如果为True,表单数据将不会点击任何元素而被提交。

该类方法的其他参数直接传递给FormRequest构造函数。

新版本0.10.3:formname参数。

新版本0.17:formxpath参数。

1.1.0版中的新功能:formcss参数。

版本1.1.0中的新增:formid参数。

请求使用示例

使用FormRequest通过HTTP POST发送数据

如果要在蜘蛛中模拟HTML Form POST并发送几个键值字段,则可以返回一个FormRequest对象(来自您的蜘蛛),如下所示:

返回
[
FormRequest
(
url
=
“http://www.example.com/post/action”
,
formdata
=
{
'name'
:
'John Doe'
,
'age'
:
'27'
},
回调
=
自我
after_post
)]

使用FormRequest.from_response()来模拟用户登录

通常,网站通过<inputtype="hidden">元素(如会话相关数据或身份验证令牌(用于登录页面))提供预填充表单字段。抓取时,您需要自动预先填充这些字段,并覆盖其中的几个字段,例如用户名和密码。您可以对此作业使用FormRequest.from_response()方法。这是一个使用它的蜘蛛的例子:

进口
刮板
LoginSpider
类
(
scrapy。Spider
):
name
=
'example.com'
start_urls
=
[
'http://www.example.com/users/login.php'
]
def
解析
(
self
,
response
):
返回
刮
。
FormRequest
。
from_response
(
回应
,
formdata
=
{
'username'
:
'john'
,
'password'
:
'secret'
},
回调
=
自我
after_login
)
def
after_login
(
self
,
response
):
#检查登录成功后再继续
如果
“认证失败”
作为
响应
。
身体
:
自我
记录器
错误
(
“登录失败”
)
返回
#继续使用验证会话进行抓取...

响应对象

scrapy.http.

Response

url

[

status = 200

headers = None

body = b''

flags = None

request = None

]

Response对象表示HTTP响应,通常由下载(由Downloader)下载,并将其馈送到Spiders进行处理。

参数: urlstring) - 此响应的URLstatusinteger) - 响应的HTTP状态。默认为200headersdict) - 此响应的头文件。dict值可以是字符串(对于单值头)或列表(对于多值头)。身体str) - 反应体。它必须是str,而不是unicode,除非您使用的是编码感知的Response子类,例如TextResponseflagslist) - 是包含Response.flags属性初始值的列表。如果给出,列表将被复制。requestRequest对象) -Response.request属性的初始值。这表示生成此响应的Request

url

一个包含响应URL的字符串。

此属性为只读。要更改响应的URL,请使用replace()

status

表示响应的HTTP状态的整数。示例:404

headers

包含响应头的类似字典的对象。可以使用get()返回值,以返回具有指定名称的第一个头值或getlist()返回具有指定名称的所有头值。例如,此通话将会给您标题中的所有Cookie:

回应
。
标题
getlist
(
'Set-Cookie'
)

body

这个回应的身体。请记住,Response.body始终是一个字节对象。如果您希望unicode版本使用TextResponse.text(仅在TextResponse和子类中可用)。

此属性为只读。要改变一个Response的body使用replace()

request

生成此响应的Request对象。这个属性在Scrapy引擎中被分配,在响应和请求已经通过所有的Downloader Middlewares之后。特别是,这意味着:

  • HTTP重定向将导致原始请求(重定向之前的URL)分配给重定向的响应(重定向后的最终URL)。
  • Response.request.url并不总是等于Response.url
  • 此属性仅适用于蜘蛛代码,而在 Spider Middlewares中 ,但不在“Downloader Middlewares”(尽管您可以通过其他方式提供请求)以及 response_downloaded 信号的处理程序。

meta

Response.request对象的Request.meta属性的快捷方式(即self.request.meta)。

Response.request属性不同,Response.request属性沿重定向和重试传播,因此您将获得从您的蜘蛛发送的原始Request.meta

也可以看看

Request.meta属性

flags

包含此响应标志的列表。标记是用于标记响应的标签。例如:“缓存”,“重定向”等。它们显示在引擎用于记录的Response(__str__方法)的字符串表示中。

copy

返回一个新的响应,它是此响应的副本。

replace

[

url

status

headers

body

request

flags

cls

]

返回具有相同成员的Response对象,除了通过指定哪个关键字参数给出新值的那些成员之外。默认情况下复制Response.meta属性。

urljoin

url

通过将Response的url与可能的相对URL相结合来构造绝对URL。

这是一个包装在urlparse.urljoin上,它只是一个别名进行这个调用:

urlparse
。
urljoin
(
response。url
,
url
)

follow

url

callback = None

method ='GET'

headers = None

body = None

cookies = None

meta = None

encoding ='utf-8'

priority = 0

dont_filter = False

errback =

返回一个Request实例来跟踪一个链接url。它接受与Request.__init__方法相同的参数,但url可以是相对URL或scrapy.link.Link对象,而不仅仅是绝对URL。

TextResponse提供了一个follow()方法,它支持绝对/相对URL和链接对象之外的选择器。

响应子类

以下是可用的内置Response子类的列表。您还可以将Response类子类化以实现您自己的功能。

TextResponse对象

scrapy.http.

TextResponse

url

[

encoding

[

...

]

]

TextResponse对象将编码功能添加到基本的Response类,该类仅用于二进制数据,如图像,声音或任何媒体文件。

除了基本的Response对象之外,TextResponse对象还支持一个新的构造函数参数。其余的功能与Response类相同,这里没有记录。

参数: encodingstring) - 是一个包含用于此响应的编码的字符串。如果您使用unicode主体创建一个TextResponse对象,它将使用该编码进行编码(请记住body属性始终是一个字符串)。如果encodingNone(默认值),编码将在响应标头和正文中查找。

除了标准的Response对象之外,TextResponse对象还支持以下属性:

text

响应体,如unicode。

response.body.decode(response.encoding)相同,但结果在第一次调用后缓存,因此您可以多次访问response.text,而不需要额外的开销。

注意

unicode(response.body)不是将响应体转换为unicode的正确方法:您将使用系统默认编码(通常为ascii)而不是响应编码。

encoding

具有该响应编码的字符串。通过尝试以下机制来解决编码,顺序如下:

  1. 编码在构造函数 encoding中 传递
  2. 在Content-Type HTTP头中声明的编码。 如果此编码无效(即未知),则会被忽略,并尝试下一个解析机制。
  3. 在响应体中声明的编码。 TextResponse类不提供任何特殊的功能。 但是, HtmlResponseXmlResponse 类都可以。
  4. 通过查看响应体来推断编码。 这是更脆弱的方法,但也是最后一个尝试。

selector

使用响应作为目标的Selector实例。选择器在第一次访问时被延迟实例化。

除了标准的Response对象之外,TextResponse对象还支持以下方法:

xpath

query

TextResponse.selector.xpath(query)快捷方式:

回应
。
xpath
(
'// p'
)

css

查询

TextResponse.selector.css(query)快捷方式:

回应
。
css
(
'p'
)

follow

url

callback = None

method ='GET'

headers = None

body = None

cookies = None

meta = None

encoding = None

priority = 0

dont_filter = False

errback =

返回一个Request实例来跟踪一个链接url。它接受与Request.__init__方法相同的参数,但url不仅可以是绝对URL,而且也可以

  • 相对URL;
  • 一个scrapy.link.Link对象(例如链接提取器结果);
  • 属性Selector(不是SelectorList) - 例如 response.css('a::attr(href)')[0]response.xpath('//img/@src')[0]
  • < a > 元素的选择器,例如 response.css('a.my_link')[0]

请参阅创建使用示例请求的快捷方式

body_as_unicode

text相同,但可作为一种方法。该方法保持向后兼容;请喜欢response.text

HtmlResponse对象

scrapy.http.

HtmlResponse

url

[

...

]

HtmlResponse类是HtmlResponse的一个子类,它通过查看HTML元数据http-equiv属性来添加编码自动发现支持。请参阅TextResponse.encoding

XmlResponse对象

scrapy.http.

XmlResponse

url

[

...

]

XmlResponse类是XmlResponse的一个子类,它通过查看XML声明行来添加编码自动发现支持。请参阅TextResponse.encoding

results matching ""

    No results matching ""