vlambda博客
学习文章列表

NO.5 Scrapy爬虫框架中的 Request 和 Response 对象

      

通过上一篇文章对 Scrapy框架结构的讲解,大家也就了解了 Request 和 Response 对象在 Scrapy 框架中的重要性,下面详细介绍这两个对象。



Request对象


Request对象用来描述一个 HTTP 请求,下面是其构造器方法的参数列表,


class scrapy.http.Request(url[, callback, method='GET', headers, body, cookies, meta, encoding='utf-8', priority=0, dont_filter=False, errback])


下面依次介绍这些参数:


  • url (string) (必选)

  • callback (callable) 

    页面解析函数,Callable 类型,Request 对象请求的页面下载完成后,由该参数指定的页面解析函数被调用。如果未传递该参数,默认调用 Spider 的 parse 方法

  • method (string)

    HTTP请求的方法,默认为‘GET’。

  • headers (dict) 

    HTTP 请求的头部字典,dict类型,例如: {'Accept': 'text/html', 'User-Agent': 'Mozilla/5.0'}。

  • body (str or unicode)

    HTTP请求的正文。

  • cookies (dict or list) 

    Cookie 信息字典,dict 类型,例如:{'currency': 'USD', 'country': 'UY'}

  • meta (dict) 

    Request 的元数据字典,dict 类型,用于给框架中其他组件传递信息,比如中间件 Item Pipeline。其他组件可以使用 Request 对象的 meta 属性访问该元数据字典(request.meta),也用于给响应处理函数传递信息,详见 Response 的 meta 属性。

  • encoding (string) 

    url 和 body 参数的编码默认为 ‘utf-8’。如果传入的 url 或 body 参数是 str 类型,就使用该甘薯进行编码。

  • priority(int) 

    请求的优先级默认值为0,优先级高的请求优先下载。

  • dont_filter (boolean)  

  • errback (callable) 

    请求出现异常或者出现 HTTP 错误时(如 404页面不存在 )的回调函数。


虽然参数很多,但除了 url 参数外,其他都带有默认值。在构造 Request 对象时,通常我们只需传递一个 url 参数或再加一个 callback 参数,其他使用默认值即可。

如:

request = scrapy.Request('http://books.toscrape.com/')request2 = scrapy.Request('http://quotes.toscrape.com/',callback=self.parseItem)

带参数的方式,如 demo1 中最下方的:

NO.5 Scrapy爬虫框架中的 Request 和 Response 对象


在实际应用中,我们几乎只调用 Request 的构造器创建对象,但也可以根据要求访问 Request 对象的属性,常用的有以下几个:

  • url

  • method

  • headers

  • body

  • meta


这些属性和构造器参数相对应,这里不再重复解释。




Response对象


Response 对象用来描述一个 HTTP 响应,Response 只是一个基类,根据响应内容的不同有如下子类:
  • TextResponse

  • HtmlResponse

  • XmlResponse


当一个页面下载完成时,下载器依据 HTTP 响应头部中的 Content-Type 信息创建某个 Response 的子类对象。我们通常爬取的网页,其内容是 HTML 文本,创建的便是  HtmlResponse 对象,其中  HtmlResponse 和  XmlResponse Text Response 的子类。实际上,这 3 个子类只有细微的差别,这里以  HtmlResponse 为例进行讲解。
下面介绍  HtmlResponse 对象的属性及方法。

  • url

  • status

    HTTP 响应的状态码,int 类型,例如:200、404。

  • headers

    HTTP 响应头部,类字典类型,可以调用 get 或 getlist 方法对其进行访问,例如:

    response.headers.get('Content-Type')

    response.headers.getlist('Set-Cookie')

  • body

    HTTP 响应正文,bytes 类型。

  • text

    文本形式的HTTP 响应正文,str 类型,它是由 response.body 使用 response.encoding 解码得到的,即:

    response.text = response.body.decode(response.encoding)

  • encoding

    HTTP 响应正文的编码,它的值可能是从 HTTP 响应头部或正文中解析出来的。

  • request

    产生该HTTP 响应Request 对象。

  • meta

    即 response.request.meta,在构造 Request 对象时,可将要传递给响应处理函数的信息通过 meta 参数传入;响应处理函数处理响应时,通过 response.meta 将信息去除。

  • selector

    Selector 对象用于在 Response 中提取数据(选择器相关话题在后面会详细讲解)。

  • xpath(query)

    使用 XPath 选择器在 Response 中提取数据,实际上它是 response.selector.xpath 方法的快捷方式(选择器相关话题在后面会详细讲解)。

  • css(query)

    使用 CSS 选择器 在 Response 中提取数据,实际上它是 response.selector.css 方法的快捷方式(选择器相关话题在后面会详细讲解)。

  • urljoin(url)

虽然 HtmlResponse 对象有很多属性,但最常用的是以下的 3 个方法:

  • xpath(query)

  • css(query)

  • urljoin(query)


前两个方法用于提取数据,后一个方法用于构造绝对url。




内容参考:

《精通Scrapy网络爬虫》、百度



END




这里“阅读原文”,查看github中的代码