共计 3357 个字符,预计需要花费 9 分钟才能阅读完成。
【百度云搜寻,搜各种材料:http://www.lqkweb.com】
【搜网盘,搜各种材料:http://www.swpan.cn】
信号个别应用信号散发器 dispatcher.connect(),来设置信号,和信号触发函数,当捕捉到信号时执行一个函数
dispatcher.connect()信号散发器,第一个参数信号触发函数,第二个参数是触发信号,
以下是各种信号
signals.engine_started 当 Scrapy 引擎启动爬取时发送该信号。该信号反对返回 deferreds。
signals.engine_stopped 当 Scrapy 引擎进行时发送该信号(例如,爬取完结)。该信号反对返回 deferreds。
signals.item_scraped(item, response, spider)当 item 被爬取,并通过所有 Item Pipeline 后(没有被抛弃(dropped),发送该信号。该信号反对返回 deferreds。
参数:
item (Item 对象) – 爬取到的 item
spider (Spider 对象) – 爬取 item 的 spider
response (Response 对象) – 提取 item 的 response
signals.item_dropped(item, exception, spider)当 item 通过 Item Pipeline,有些 pipeline 抛出 DropItem 异样,抛弃 item 时,该信号被发送。该信号反对返回 deferreds。
参数:
item (Item 对象) – Item Pipeline 抛弃的 item
spider (Spider 对象) – 爬取 item 的 spider
exception (DropItem 异样) – 导致 item 被抛弃的异样(必须是 DropItem 的子类)
signals.spider_closed(spider, reason)当某个 spider 被敞开时,该信号被发送。该信号能够用来开释每个 spider 在 spider_opened 时占用的资源。该信号反对返回 deferreds。
参数:
spider (Spider 对象) – 敞开的 spider
reason (str) – 形容 spider 被敞开的起因的字符串。如果 spider 是因为实现爬取而被敞开,则其为 ‘finished’。否则,如果 spider 是被引擎的 close_spider 办法所敞开,则其为调用该办法时传入的 reason 参数(默认为 ‘cancelled’)。如果引擎被敞开(例如,输出 Ctrl-C),则其为 ‘shutdown’。
signals.spider_opened(spider)当 spider 开始爬取时发送该信号。该信号个别用来调配 spider 的资源,不过其也能做任何事。该信号反对返回 deferreds。
参数: spider (Spider 对象) – 开启的 spider
signals.spider_idle(spider)当 spider 进入闲暇 (idle) 状态时该信号被发送。闲暇意味着:
requests 正在期待被下载
requests 被调度
items 正在 item pipeline 中被解决
当该信号的所有处理器 (handler) 被调用后,如果 spider 依然放弃闲暇状态,引擎将会敞开该 spider。当 spider 被敞开后,spider_closed 信号将被发送。您能够,比方,在 spider_idle 处理器中调度某些申请来防止 spider 被敞开。该信号 不反对 返回 deferreds。
参数: spider (Spider 对象) – 闲暇的 spider
signals.spider_error(failure, response, spider)当 spider 的回调函数产生谬误时(例如,抛出异样),该信号被发送
参数:
failure (Failure 对象) – 以 Twisted Failure 对象抛出的异样
response (Response 对象) – 当异样被抛出时被解决的 response
spider (Spider 对象) – 抛出异样的 spider
signals.request_scheduled(request, spider)当引擎调度一个 Request 对象用于下载时,该信号被发送。该信号 不反对 返回 deferreds。
参数:
request (Request 对象) – 达到调度器的 request
spider (Spider 对象) – 产生该 request 的 spider
signals.response_received(response, request, spider)当引擎从 downloader 获取到一个新的 Response 时发送该信号。该信号 不反对 返回 deferreds。
参数:
response (Response 对象) – 接管到的 response
request (Request 对象) – 生成 response 的 request
spider (Spider 对象) – response 所对应的 spider
signals.response_downloaded(response, request, spider)当一个 HTTPResponse 被下载时,由 downloader 发送该信号。该信号 不反对 返回 deferreds。
参数:
response (Response 对象) – 下载的 response
request (Request 对象) – 生成 response 的 request
spider (Spider 对象) – response 所对应的 spider
咱们以 signals.spider_closed(spider, reason)信号举例其余信号同理:
# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request,FormRequest
from scrapy.xlib.pydispatch import dispatcher # 信号散发器
from scrapy import signals # 信号
class PachSpider(scrapy.Spider): #定义爬虫类,必须继承 scrapy.Spider
name = 'pach' #设置爬虫名称
allowed_domains = ['www.dict.cn'] #爬取域名
def start_requests(self): #起始 url 函数,会替换 start_urls
return [Request(
url='http://www.dict.cn/9999998888',
callback=self.parse
)]
# 利用数据收集器,收集所有 404 的 url 以及,404 页面数量
handle_httpstatus_list = [404] # 设置不过滤 404
def __init__(self):
self.fail_urls = [] # 创立一个变量来贮存 404URL
dispatcher.connect(self.spider_closed, signals.spider_closed) # dispatcher.connect()信号散发器,第一个参数信号触发函数,第二个参数是触发信号,signals.spider_closed 是爬虫完结信号
def spider_closed(self, spider, reason): # 信号触发函数
print('爬虫完结 进行爬虫')
print(self.fail_urls) # 打印 404URL 列表
print(self.crawler.stats.get_value('failed_url')) # 打印数据收集值
def parse(self, response): # 回调函数
if response.status == 404: # 判断返回状态码如果是 404
self.fail_urls.append(response.url) # 将 URL 追加到列表
self.crawler.stats.inc_value('failed_url') # 设置一个数据收集,值为自增,每执行一次自增 1
else:
title = response.css('title::text').extract()
print(title)