3

抱歉,如果这是一个草率的菜鸟问题,但我花了很长时间寻找这个问题的答案:

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

我已经阅读了文档,但不确定是否有内置的方法可以做到这一点?由于页面默认由系统下载,因此编写自定义管道等似乎没有意义

4

1 回答 1

9

正如保罗所说,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

于 2013-11-11T21:35:09.840 回答