Scrapy教程

Scrapy 请求和响应

说明

Scrapy 可以使用 RequestResponse 对象抓取网站。请求对象通过系统,使用爬虫执行请求,并在返回响应对象时返回请求。

请求对象

请求对象是一个生成响应的 HTTP 请求。它有以下类-
class scrapy.http.Request(url[, callback, method = 'GET', headers, body, cookies, meta,
   encoding = 'utf-8', priority = 0, dont_filter = false, errback])
下表显示了请求对象的参数-
参数和说明
url
这是一个指定 URL 请求的字符串。
callback
这是一个可调用的函数,它使用请求的响应作为第一个参数。
method
是指定HTTP方法请求的字符串。
headers
这是一个带有请求头的字典。
body
它是有请求体的字符串或unicode。
cookies
这是一个包含请求cookies的列表。
meta
它是一个包含请求元数据值的字典。
encoding
是一个包含utf-8编码的字符串,用于对URL进行编码。
priority
它是一个整数,调度器使用优先级来定义处理请求的顺序。
dont_filter
它是一个布尔值,指定调度程序不应过滤请求。
errback
这是一个可调用的函数,在处理请求时出现异常时调用。

向回调函数传递额外数据

当响应作为其第一个参数下载时调用请求的回调函数。
例如-
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 的一些键-
键和说明
dont_redirect
当设置为true时是一个键,不会根据响应的状态重定向请求。
dont_retry
设置为true时是一个键,不会重试失败的请求,中间件会忽略。
handle_httpstatus_list
它是一个键,用于定义每个请求的响应代码可以被允许。
handle_httpstatus_all
它是一个键,用于通过将其设置为 true 来允许请求的任何响应代码。
dont_merge_cookies
这是一个用于避免与现有 cookie 合并的键,通过将其设置为 true
cookiejar
它是一个用于保持每个爬虫的多个cookie会话的密钥。
dont_cache
它是用于避免缓存每个策略上的 HTTP 请求和响应的键。
redirect_urls
它是一个包含请求通过的 URL 的键。
bindaddress
可以用来执行请求的传出IP地址的IP。
dont_obey_robotstxt
当设置为 true 时,它​​是一个键,不会过滤 robots.txt 排除标准禁止的请求,即使启用了 ROBOTSTXT_OBEY。
download_timeout
它用于设置每个爬虫的超时(以秒为单位),下载器将在超时之前等待。
download_maxsize
用于设置下载器将下载的每个爬虫的最大大小(以字节为单位)。
proxy
可以为Request对象设置Proxy,为请求的使用设置HTTP代理。

请求子类

您可以通过子类化请求类来实现您自己的自定义功能。内置的请求子类如下-

FormRequest 对象

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, ...])
下表显示了上述类的参数-
参数和说明
response
它是一个对象,用于使用 HTML 响应形式预先填充表单字段。
formname
如果指定,将使用具有名称属性的表单的字符串。
formnumber
当响应中有多个表单时使用的表单整数。
formdata
它是用于覆盖的表单数据中字段的字典。
formxpath
指定时为字符串,使用与xpath匹配的形式。
formcss
指定时为字符串,使用与css选择器匹配的表单。
clickdata
是用来观察被点击控件的属性字典。
dont_click
当设置为 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 对象的参数-
参数和说明
url
是指定URL响应的字符串。
status
它是一个包含HTTP状态响应的整数。
headers
这是一个包含响应头的字典。
body
这是一个带有响应体的字符串。
flags
这是一个包含响应标志的列表。

响应子类

您可以通过继承响应类来实现您自己的自定义功能。内置响应子类如下-
TextResponse 对象
TextResponse 对象用于二进制数据,例如图像、声音等,具有对基本响应进行编码的能力e类。它有以下类-
class scrapy.http.TextResponse(url[, encoding[,status = 200, headers, body, flags]])
以下是参数-
encoding-它是一个带有编码的字符串,用于对响应进行编码。
注意-其余参数与响应类相同,在 响应对象部分进行了解释。
下表显示了 TextResponse 对象支持的属性以及响应方法-
属性和描述
text
它是一个响应体,其中 response.text 可以被多次访问。
encoding
这是一个包含响应编码的字符串。
selector
它是在第一次访问时实例化的属性,并使用响应作为目标。
下表显示了 TextResponse 对象支持的方法以及 response 方法-
方法和说明
xpath (query)
它是TextResponse.selector.xpath(query)的快捷方式。
css (query)
它是TextResponse.selector.css(query)的快捷方式。
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])
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4