Scrapy - 将已爬网页面存储为静态文件

时间:2013-11-11 15:33:49

标签: scrapy

道歉,如果这是一个scrapy noob问题,但我花了很多年时间寻找答案:

我想存储每个&的原始数据。我在本地文件系统中作为单独文件爬行的每个URL(即response.body - > /files/page123.html) - 理想情况下,文件名是URL的哈希值。这样我就可以进一步处理HTML(即进一步解析,在Solr / ElasticSearch中进行索引等)。

我已经阅读了文档并且不确定是否有内置的方法来执行此操作?由于系统默认下载页面,因此编写自定义管道等似乎没有意义

1 个答案:

答案 0 :(得分:8)

正如保罗所说HttpCache中间件可能适合你,但我建议你写自己的自定义管道。

Scrapy将built-in ways导出数据到文件,但它们用于json,xml和csv而不是原始html。不要担心,虽然不是太难!

如果您的items.py看起来像:

from scrapy.item import Item, Field

class Listing(Item):
    url = Field()
    html = Field()

并且您已将抓取的数据保存到蜘蛛中的那些项目,如下所示:

item['url'] = response.url
item['html'] = response.body

您的pipelines.py就是:

import hashlib
class HtmlFilePipeline(object):
    def process_item(self, item, spider):
        file_name = hashlib.sha224(item['url']).hexdigest() #chose whatever hashing func works for you
        with open('files/%s.html' % file_name, 'w+b') as f:
            f.write(item['html'])

希望有所帮助。哦,不要忘记并在项目根目录中放置files/目录并添加到settings.py

ITEM_PIPELINES = {
'myproject.pipeline.HtmlFilePipeline': 300,

}

来源:http://doc.scrapy.org/en/latest/topics/item-pipeline.html