Scrapy学习笔记(9)---Requests and Responses

来源:互联网 发布:淘宝让朋友刷有风险吗 编辑:程序博客网 时间:2024/06/08 06:17

通常情况下,Request对象在爬行器中生成,并传递到系统中,直到它们到达Downloader,后者执行请求,并返回一个Response对象,该对象返回到发出请求的爬行器。
Request对象表示一个HTTP请求,通常是在爬行器中生成,然后由Downloader执行,从而生成一个Response。
Request objects
class scrapy.http.Request(url[, callback, method=’GET’, headers, body, cookies, meta, encoding=’utf-8’, priority=0, dont_filter=False, errback, flags])
参数:
url(string)—请求的URL。
callback(callable)—该函数将被调用,它的第一个参数是该请求的响应。如果一个Request没有指定一个回调,那么将使用爬行器的parse()方法。如果在处理过程中出现异常,则会调用errback。
method(string)—请求的HTTP方法,默认为’GET’。
meta(dict)—Request.meta的初始值。如果给定,该参数中传递的字典将被复制。
body(str or unicode)—请求主体。
headers(dict)—请求的头部。这个值可以是字符串(对于单个值的头)或列表(对于多值的头)。
cookies(dict or list)—后一种形式允许定制cookie的域和路径属性。只有当cookie被保存为以后的请求时才有用。当某个站点返回cookie(在响应中),这些cookie将存储在该域中的cookie中,并将在以后的请求中再次发送。
encoding(string)—默认为’utf-8’。
priority(int)—默认为0。
dont_filter(boolean)—表示该请求不应被调度器过滤。当您想要多次执行相同的请求时,可以忽略重复的过滤器。
errback(callable)—在处理请求时,出现异常,该函数将被调用。
flags(list)—发送到请求的标志可以用于日志记录或类似的目的。

属性和方法:
url:包含该请求的URL的字符串。请记住,这个属性包含了转义的URL,因此它可以与构造函数中传递的URL不同。这个属性是只读的。要更改请求的URL使用replace()。
method:一个表示请求中的HTTP方法的字符串。这肯定是大写的。
body:一个包含请求体的str对象。这个属性是只读的。要更改请求的URL使用replace()。
meta:一个包含该请求的任意元数据的字典。这个对于新请求来说是空的,通常由不同的Scrapy组件(扩展、中间件等)填充。因此,这个字典中包含的数据依赖于您所启用的扩展。
copy():返回一个新请求,该请求是该请求的副本。
replace([url, method, headers, body, cookies, meta, encoding, dont_filter, callback, errback]):用相同的成员返回一个请求对象,除了那些通过指定的关键字参数给出新值的成员。

将附加数据传递给回调函数

请求的回调是一个函数,当该请求的响应被下载时将被调用。回调函数将以下载的Response对象作为第一个参数来调用。
在某些情况下,您可能感兴趣的是将参数传递给那些回调函数,以便稍后在第二个回调函数中接收到参数。您可以使用Request.meta属性。

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

Request.meta特殊键

  • dont_redirect
  • dont_retry
  • handle_httpstatus_list
  • handle_httpstatus_all
  • dont_merge_cookies (see cookies parameter of Request constructor)
  • cookiejar
  • dont_cache
  • redirect_urls
  • bindaddress
  • dont_obey_robotstxt
  • download_timeout
  • download_maxsize
  • download_latency
  • download_fail_on_dataloss
  • proxy
  • ftp_user (See FTP_USER for more info)
  • ftp_password (See FTP_PASSWORD for more info)
  • referrer_policy
  • max_retry_times

FormRequest objects

class scrapy.http.FormRequest(url[, formdata, …])
参数:formdata(dict or iterable of tuples)—是一个字典(或可迭代的(键值)元组)包含HTML表单数据,这些数据将被url编码并分配给请求的主体。
classmethod from_response(response[, formname=None, formid=None, formnumber=0, formdata=None, formxpath=None, formcss=None, clickdata=None, dont_click=False, …])
返回一个新的FormRequest对象,它的表单字段值是预先填充的,这些值是在给定响应中包含的HTML的元素中找到的。
该策略是在默认情况下自动模拟单击,在任何形式的控件中,都是可点击的。

使用FormRequest通过HTTP POST发送数据

return [FormRequest(url="http://www.example.com/post/action",                    formdata={'name': 'John Doe', 'age': '27'},                    callback=self.after_post)]

使用FormRequest.from_response()来模拟用户登录
对于web站点来说,通过元素,提供预先填充的表单字段是很常见的,例如会话相关数据或身份验证令牌(用于登录页面)。

import scrapyclass 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        # continue scraping with authenticated session...

Response objects
class scrapy.http.Response(url[, status=200, headers=None, body=b”, flags=None, request=None])
属性和方法:
url—包含响应的URL的字符串。只读。
status—表示响应的HTTP状态的整数。
headers—一个类似于字典的对象,它包含响应头。可以使用get()来访问值,用指定的名称返回第一个头值,或getlist()以返回带有指定名称的所有头值。
body—这个Response的主体。body总是一个字节对象。
request—生成此响应的请求对象。这个属性是在响应和请求已经通过了所有的Downloader Middlewares之后在Scrapy引擎中分配的。
HTTP重定向将导致原始请求(在重定向之前的URL)被分配给重定向响应(在重定向后使用最终的URL)。
Response.request.url 不总是等于Response.url。
这个属性只在爬虫代码中可用,在爬行器中间件中,但不是在Downloader中间件中(尽管您可以通过其他方式获得请求)和响应下载信号的处理程序。
meta
flags
copy()
replace([url, status, headers, body, request, flags, cls])
urljoin(url)—通过将响应的url与可能的相对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=None)

TextResponse objects
class scrapy.http.TextResponse(url[, encoding[, …]])
属性和方法:
text
encoding—编码是通过以下机制来解决的:
1.在构造函数编码参数中传递的编码;
2.在content-type HTTP头中声明的编码。如果这个编码是无效的,它被忽略,下一个解析机制被尝试。
3.响应体中声明的编码。TextResponse类没有提供任何特殊的功能。
4.通过观察响应体来推断编码。这是一种更脆弱的方法,但也是最后一种方法。
selector
xpath(query)
css(query)
follow(url, callback=None, method=’GET’, headers=None, body=None, cookies=None, meta=None, encoding=None, priority=0, dont_filter=False, errback=None)
body_as_unicode()—为了兼容

HtmlResponse objects
class scrapy.http.HtmlResponse(url[, …])

XmlResponse objects
class scrapy.http.XmlResponse(url[, …])

原创粉丝点击