Python3 的 Scrapy 爬虫框架 中数据爬取过程中请求和响应操作。
Request 对象在数据抓取中生成,并在系统中传递到达下载程序,后者执行请求并返回 Response 对象,该对象返回到发出请求的spider。
在这里插入图片描述
class scrapy.http.Request(*args, **kwargs)
参数说明:
请求的回调是在下载该请求的响应时调用的函数。
def parse_page1(self, response): return scrapy.Request("http://www.xxxx.com", callback=self.parse_page2)def parse_page2(self, response): self.logger.info("访问 %s", response.url)
在第二个回调中接收参数使用 Request.cb_kwargs 属性。
def parse(self, response): request = scrapy.Request("http://www.xxxx.com", callback=self.parse_page2, cb_kwargs=dict(main_url=response.url)) request.cb_kwargs['xxx'] = 'xxx' # 回调添加参数 yield requestdef parse_page2(self, response, main_url, foo): yield dict( main_url=main_url, other_url=response.url, foo=foo, )
import scrapyfrom scrapy.spidermiddlewares.httperror import HttpErrorfrom twisted.internet.error import DNSLookupErrorfrom twisted.internet.error import TimeoutError, TCPTimedOutErrorclass ErrbackSpider(scrapy.Spider): name = "errback" start_urls = [ "http://www.xxx.org/", # 200 正常访问 "http://www.xxx.org/status/404", # 404 无页面 "http://www.xxx.org/status/500", # 500 服务器挂了 "http://www.xxx.org:12345/", # 超时访问不到主机端口 "http://www.xxx.org/", # DNS解析错误 ] 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('成功访问 {}'.format(response.url)) ...... def errback_httpbin(self, failure): # 全部的失败日志 self.logger.error(repr(failure)) # 如果想对某些错误进行特殊处理,需要失败的类型 if failure.check(HttpError): # 这些异常来自HttpError Spider中间件获得非200的相应 response = failure.value.response self.logger.error('HttpError on %s', response.url) elif failure.check(DNSLookupError): # 这是原始请求 request = failure.request self.logger.error('DNSLookupError on %s', request.url) elif failure.check(TimeoutError, TCPTimedOutError): request = failure.request self.logger.error('TimeoutError on %s', request.url)
在处理请求失败时,可能要访问回调函数的参数,可以根据errback中的参数进行处理。
def parse(self, response): request = scrapy.Request('http://www.xxx.com/', callback=self.parse_page2, errback=self.errback_page2, cb_kwargs=dict(main_url=response.url)) yield requestdef parse_page2(self, response, main_url): passdef errback_page2(self, failure): yield dict( main_url=failure.request.cb_kwargs['url'], )
参数说明:
在这里插入图片描述
import scrapyclass StopSpider(scrapy.Spider): name = "stop" start_urls = ["https://docs.scrapy.org/en/latest/"] @classmethod def from_crawler(cls, crawler): spider = super().from_crawler(crawler) crawler.signals.connect(spider.on_bytes_received, signal=scrapy.signals.bytes_received) return spider def parse(self, response): # last_chars 表明未下载完整响应 yield {"len": len(response.text), "last_chars": response.text[-40:]} def on_bytes_received(self, data, request, spider): raise scrapy.exceptions.StopDownload(fail=False)
FormRequest对象,用于传递参数的类,具有处理HTML表单的功能。返回一个新FormRequest对象,该对象的表单字段值预先填充 form给定响应中包含的HTML元素中的表单字段值。
class scrapy.http.FormRequest(url[, formdata, ...])
参数说明: 1. response(Response对象):包含HTML表单的响应用于填充表单字段 2. formname(str):若定义,将使用name属性设置为该值的表单。 3. formid(str):若定义,将使用id属性设置为此值的表单。 4. formxpath(str):若定义,将使用与xpath匹配的第一个形式。 5. formcss(str):若定义,将使用与css选择器匹配的第一个形式。 6. formnumber(int):响应包含多个表单时要使用的表单数。第一个(也是默认值)是0。 7. formdata(dict):表单数据中要覆盖的字段。如果响应
元素中已经存在一个字段,则该字段的值将被传入此参数的字段覆盖。如果在此参数中传递的值为None,则即使该字段存在于响应元素中,该字段也不会包含在请求中。 8. clickdata(dict):查找单击的控件的属性。如果未提供,则将模拟第一个clickable元素上的单击提交表单数据。除了html属性外,还可以通过该nr属性,通过相对于表单内其他可提交输入的,从零开始的索引来标识该控件。 9. dont_click(bool):如果为True,则无需单击任何元素即可提交表单数据。
import scrapydef authentication_failed(response): # 检查响应的内容,如果失败,则返回True;如果成功,则返回False。 passclass 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): if authentication_failed(response): self.logger.error("Login failed") return
## JsonRequest 中 header设置
class scrapy.http.JsonRequest(url[, ... data, dumps_kwargs]) { 'Content-Type':'application/json', 'Accept':'application/json, text/javascript, */*; q=0.01'}
参数说明:
data = { 'name1': 'value1', 'name2': 'value2',}yield JsonRequest(url='http://www.xxx.com/post', data=data)
一个Response对象代表一个HTTP响应,通常会下载该HTTP响应(由下载程序下载),然后到Spider进行处理。
class scrapy.http.Response(* args,** kwargs)
参数说明:
可用的内置Response子类的列表,可以对Response类进行子类化,以实现设置的功能。
为 Response类增加了编码功能,该功能只能用于二进制数据,例如图像,声音或任何媒体文件。这里数据处理的方式同响应部分,都是对字符串进行处理,就不重复了。
class scrapy.http.TextResponse(url[, encoding[, ...]])
其增加了通过查看HTML编码自动发现支持META HTTP-EQUIV属性。
class scrapy.http.HtmlResponse(url[, ...])
其增加了通过查看XML声明行编码自动发现支持。
class scrapy.http.XmlResponse(url[, ...])
留言与评论(共有 0 条评论) “” |