抱歉,如果这是一个草率的菜鸟问题,但我花了很长时间寻找这个问题的答案:
我想将我在本地文件系统中抓取的每个 URL 的原始数据存储为一个单独的文件(即 response.body -> /files/page123.html) - 理想情况下,文件名是 URL 的哈希值。这样我就可以对 HTML 进行进一步处理(即在 Solr/ElasticSearch 中进一步解析、索引等)。
我已经阅读了文档,但不确定是否有内置的方法可以做到这一点?由于页面默认由系统下载,因此编写自定义管道等似乎没有意义
抱歉,如果这是一个草率的菜鸟问题,但我花了很长时间寻找这个问题的答案:
我想将我在本地文件系统中抓取的每个 URL 的原始数据存储为一个单独的文件(即 response.body -> /files/page123.html) - 理想情况下,文件名是 URL 的哈希值。这样我就可以对 HTML 进行进一步处理(即在 Solr/ElasticSearch 中进一步解析、索引等)。
我已经阅读了文档,但不确定是否有内置的方法可以做到这一点?由于页面默认由系统下载,因此编写自定义管道等似乎没有意义
正如保罗所说,HttpCache Middleware 可能对您有用,但我建议您编写自己的自定义管道。
Scrapy 具有将数据导出到文件的内置方法,但它们适用于 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