Scrapy手动将项目发送到管道不会触发item_passed信号

时间:2016-11-28 16:09:00

标签: python scrapy web-crawler signals

我正在尝试编写一个执行以下工作的爬虫: 从特定URL开始,然后将页面爬行到深度限制(简单的Scrapy任务)。在此期间,检查标头字段的前1 kB,并使用Magic提取文件信息。如果是文件,我想将其发送到管道进行进一步处理。

到目前为止我所做的是:

def process_links(self, links):

    for link in links:
        try:
            req = urlopen(link.url)
        except Exception as e:
            self.logger.error("--> Exception URL[%s]: %s", link, e)
            req = None

        if req is not None:
            ext_type = magic.from_buffer(req.read(1024))
            if 'HTML' in ext_type:
                yield link
            else:
                item = FileItem()
                item["type"] = "FILE"
                item["url"] = link.url
                item["extension"] = ext_type
                itemproc = self.crawler.engine.scraper.itemproc
                itemproc.process_item(item, self)

所以我基本上从被抓取的页面获取URL,然后根据它们的类型,我产生一个新的Request或者我手动向管道发送一个新的FileItem项目(最后两行)

我还有用于解析HTML页面的parse_page函数:

def parse_page(self, response):

    item = PageItem()
    item["type"] = "PAGE"
    item["url"] = response.request.url
    item["depth"] = response.meta['depth']
    item["response_url"] = response.url
    item["status_code"] = response.status
    item["status_msg"] = "OK"
    item["request_headers"] = response.request.headers
    item["body"] = response.body
    item["links"] = []
    yield item

产生PageItem对象。

虽然生成的PageItem在Scrapy中触发item_passed信号,但手动传递的FileItems不会触发信号。我在手动将FileItem传递给管道时遗漏了什么?

提前致谢!

0 个答案:

没有答案