我正在尝试编写一个执行以下工作的爬虫: 从特定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传递给管道时遗漏了什么?
提前致谢!