Scrapy -将抓取的页面存储为静态文件

5anewei6  于 2023-03-23  发布在  其他
关注(0)|答案(1)|浏览(131)

抱歉,如果这是一个棘手的问题,但我花了很长时间寻找答案:
我想把我在本地文件系统中抓取的每个URL的原始数据存储为一个单独的文件(即response.body -〉/files/page123.html)-理想情况下,文件名是URL的哈希值。这样我就可以对HTML做进一步的处理(即进一步解析,在Solr/ElasticSearch中索引等)。
我已经阅读了文档,不确定是否有内置的方法来实现这一点?由于页面默认是由系统下载的,因此编写自定义管道等似乎没有意义

f87krz0w

f87krz0w1#

正如paul t所说,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):
        # choose whatever hashing func works for you
        file_name = hashlib.sha224(item['url']).hexdigest()
        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

相关问题