scrapy中的request和response的参数及属性方法
request/response
这是自己看了官方文档后,进行的翻译总结,因为是自己直接从word笔记中粘贴过来的,所有显示的可能有点乱。可能有不太准确的地方,如有发现请留言。谢谢!
request
https://scrapy-chs.readthedocs.io/zh_CN/1.0/topics/request-response.html#scrapy.http.Request
classscrapy.http.Request
(url[, callback, method='GET', headers, body, cookies, meta, encoding='utf-8', priority=0, dont_filter=False, errback])
request对象表示一个HTTP请求,一般在spider文件中生成,并被下载器处理,生成一个response对象。
生成对象参数:
url:
callback:回调函数,处理返回的response对象。回调函数含有response这个参数。
method:请求方法,默认为get,还有post、put等 meta (dict) –request meta参数的初始化,字典形式,如果有,则这个字典将会被复制。包含此请求的任意元数据的dict。对于新请求,这个dict是空的,通常由不同的Scrapy组件(扩展、中间件等)填充。因此,此dict中包含的数据取决于您已启用的扩展。 meta设置的主键:https://scrapy-chs.readthedocs.io/zh_CN/1.0/topics/request-response.html#topics-request-meta dont_retry :don’t retry 请求不成功,是否重试 dont_merge_cookies (see cookies parameter of Request constructor) cookiejar dont_cache dont_obey_robotstxt :是否遵守robot协议 download_timeout :超时时间 proxy :记录发起请求的ip,使用代理时,可以更改该ip。
body (str or unicode) – 请求的主体。如果是一个unicode被传递,将自动转换为以默认utf8编码的字符串。加入body没有赋值,则会传递一个空的字符串,而不是None。
headers (dict) –字典形式,value可以为字符串也可以为列表。 cookies (dict or list) –request请求的cookies,字典或者列表形式。 可以通过两种格式来发送: 使用字典时: 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', 'value': 'USD', 'domain': 'example.com', 'path': '/currency'}])
后一种形式允许自定义cookie的域和路径属性。这只有在将cookie保存以供以后的请求时才有用。 当某些站点在响应中返回cookie时,这些cookie将存储在该域的cookie中,并将在以后的请求中再次发送。这是任何普通网络浏览器的典型行为。但是,如果出于某种原因,你希望避免与现有的cookie合并,则可以通过在Request.meta中设置Not_Merge_cookie键来指示Scrapy这样做。
request_with_cookies = Request(url="http://www.example.com", cookies={'currency': 'USD', 'country': 'UY'}, meta={'dont_merge_cookies': True}) For more info see CookiesMiddleware. encoding (string) – 该request请求的编码格式,默认为utf8。将会对请求url转换为%格式的编码。如果request的body是unicode的话,将会将body转换为str类型(utf8) priority (int) –此请求的优先级(默认为0)。调度程序使用优先级来定义用于处理请求的顺序。优先级较高的请求将更早执行。为了表示相对较低的优先级,允许使用负值. dont_filter (boolean) –指示调度程序不应过滤此请求。当您想要多次执行相同的请求时,可以使用它来忽略重复筛选器。小心使用它,否则你会进入爬行循环。默认为Flase。 errback (callable) – a function that will be called if any exception was raised while processing the request. This includes pages that failed with 404 HTTP errors and such. It receives a Twisted Failure (http://twistedmatrix.com/documents/current/api/twisted.python.failure.Failure.html) instance as first parameter. 在处理请求时引发异常时将调用的函数。这包括失败的带有404 HTTP错误的页面等等。它接收一个Twisted Failure(链接在上面)实例作为第一个参数。 |
对象的属性及方法:
url:请求的url
body:请求body,只读属性,如需更改,需要用replace()方法。
method:请求的方法,get、post、put等。
meta:包含此请求的任意元数据的dict。对于新请求,这个dict是空的,通常由不同的Scrapy组件(扩展、中间件等)填充。因此,此dict中包含的数据取决于您已启用的扩展。有关Scrapy识别的特殊元键的列表,请参见Request.meta特殊键。当使用Copy()或replace()方法克隆请求时,这个DECT会被浅表复制,并且还可以从response.meta属性在您的spider中被访问。
copy():返回一个新的request请求,是这个请求的复制。
replace([url, method, headers, body, cookies, meta, encoding, dont_filter, callback, errback]):返回具有相同成员的请求对象,但由指定的关键字参数指定的新值的成员除外。默认情况下,属性Request.meta会被复制(除非在meta参数中给出一个新值)。
向回调函数传递参数
回调函数默认将下载器返回的response对象作为第一个参数,如果想向回调函数传递更多参数,可以将参数放在request.meta字典中,再从回调函数中response.meta中取出。
request的子类:
1. FormRequest objects
classscrapy.http.FormRequest
(url[, formdata, ...])
FormRequest类向构造函数中添加了一个新参数,其余参数和Request类一样。
新加参数:
formdata:字典或键值元组类型。包含HTML表单数据,这些将被分配给url编码(get请求)或者body主体(post传送数据)。
注意使用时,一定要指明是get方法还是post方法。
除了支持标准方法外,还支持以下方法:
新增方法:
from_response
(response[, formname=None, formnumber=0, formdata=None, formxpath=None, clickdata=None, dont_click=False, ...])
类方法,返回一个FormRequest对象,其参数中的response中的指定的form表单会被给定的值填充。
示例:使用from_response模拟登陆。
其主要思路是默认情况下在任何看起来可点击的窗体控件上自动模拟单击,比如<inputtype=“Submit”>。比较方便,而且通常可行,但有时会产生难以调试的问题。
例如,在使用javascript填充和/或提交的表单时,默认的FROM_Response()行为可能不是最合适的。若要禁用此行为,可以将Not_Click参数设置为True。此外,如果您想更改单击的控件(而不是禁用它),也可以使用clickdata参数。
方法的参数:
response:response类,包含HTML表单的响应,该表单将用于预填充表单字段。
formname:str类型,如果给定,将使用name属性为此值的表单。
formxpath:str类型,如果给定,将会使用按照xpath找到的第一个表单。
formnumber :int类型,当response中包含多个表单时,该值指定使用第几个表单,默认为0
formdata:字典类型。填充response中指定的表单,如果表单中已存在数据,该数据将会被覆盖。
click_data:字典类型。通过指定单击控件的属性来查找单击控件。如果没有给定,在第一个可以点击的单击控件模拟单击来提交表单数据。除了html属性,还可以通过nr属性,对于表单内单击控件按照索引来定位。索引从0开始。
dont_click:布尔类型,将不会单击,表单将在不单击的情况下提交。
示例:
import scrapy
class LoginSpider(scrapy.Spider):
name = 'example.com'
start_urls = ['http://www.example.com/users/login.php']
def parse(self, response):
return scrapy.FormRequest.from_response(
response,
formdata={'username': 'john', 'password': 'secret'},
callback=self.after_login
)
def after_login(self, response):
# check login succeed before going on
if "authentication failed" in response.body:
self.logger.error("Login failed")
return
response
classscrapy.http.Response
(url[, status=200, headers, body, flags])
response是一个http的响应对象。由下载器下载后,并返回给解析函数来处理。.
生成对象参数:
url:str类型。response对象的url。只读属性,可以通过replace()方法来更改。
headers:字典,response的headers。字典的values可以是字符串,也可以是列表。
body:字符串,必须是str,不能是Unicode。除非使用的是可以自动编码的子类。如TextResponse类。
status:int型,返回请求的状态码。默认为200
meta:字典,response.meta属性的初始值,如果设定,该参数将会被浅复制
flags:列表,一个包含response.flags属性的初始值,如果设定,该列表将会被浅复制。
对象属性及方法:
url:
status:状态码
headers:
body:response的body,是str类型,如果需要Unicode,是用decode或者使用TextResponse.body_as_Unicode()(仅在TextResponse和子类中可用)。这个属性是只读的。若要更改响应的主体,请使用replace ()。
request:此响应的请求对象。生成此响应的请求对象。此属性在Scrapy引擎中分配,在响应和请求通过所有DownLoaderMidleware之后。
特别的:
1. HTTP重定向将导致将原始请求(重定向之前的URL)分配给重定向响应(重定向后的最终URL)。
2.response.url 并不总等于response.request.url
3.此属性仅在spider文件和spider中间件中可以使用,在download中间件中不能使用。
meta: response.request.meta的快捷方式。跟response.request不一样,response.meta是request的原始meta
flags:列表,包含响应的各种标志,例如cached(缓存)、redirected(重定向)等等。它们显示在响应的字符串表示(response._str_方法)上,该响应被引擎用于日志记录。
copy():返回一个response对象,是这个response的复制。
replace([url, status, headers, body, request, flags, cls]):
返回具有相同成员的响应对象,但由指定的关键字参数指定的新值的成员除外。默认情况下复制属性Response.meta。
urljoin(url):通过response.url和一个相对url来构建一个绝对url。其实是通过 urlparse.urljoin来实现的,是他的别名。
实际是这样:
response.urljoin(url)等同于:
urlparse.urljoin(response.url, url)
response的子类
1.TextResponse
https://scrapy-chs.readthedocs.io/zh_CN/1.0/topics/request-response.html#scrapy.http.TextResponse
classscrapy.http.TextResponse
(url[, encoding[, ...]])
基于response基础上添加了编码功能,比response多了一个encoding参数。
参数:
encoding:字符串。包含要用于此响应的编码的字符串。如果使用的response body是Unicode创建TextResponse对象,则将使用此编码对其进行编码(记住body属性始终是一个字符串)。如果编码为None(默认值),则将在响应头和响应正文中查找编码。
属性及方法:
除了response类的属性方法外,还支持一下属性方法:
encoding:响应对象的编码。字符串类型,主要按照一下顺序来确认编码类型:
1.生成响应对象时指定的编码,即前面参数中指定的encoding。
2.http报头(headers)中声明的编码。如果未知(ie.unknown),则会自动忽略,并尝试下一个方法。
3.在响应对象中声明的方法,TextResponse未提供此功能,但是HtmlResponse和XmlResponse类提供了此项功能。
4.通过response的响应体(body)进行推断。(不靠谱)
selector:response的选择器对象,选择器在第一次访问时实例化。
body_as_unicode():以Unicode格式返回response响应体(body)
response.body_as_unicode()相当于:response.body.decode(response.encoding)
xpath(query):
是response.selector.xpath()的快捷方式
css(query):
是response.selector.css()的快捷方式
2.HtmlResponse objects
https://scrapy-chs.readthedocs.io/zh_CN/1.0/topics/request-response.html#scrapy.http.HtmlResponse
HtmlResponse类是TextResponse的一个子类,它通过查看HTML元http-equv属性来添加编码自动发现支持
3. XmlResponse
https://scrapy-chs.readthedocs.io/zh_CN/1.0/topics/request-response.html#scrapy.http.XmlResponse
XmlResponse类是TextResponse的一个子类,它通过查看XML声明行添加编码自动发现支持