繁体   English   中英

如何动态更改 scrapy 中的下载文件夹?

[英]How to dynamically change download folder in scrapy?

我正在使用 scrapy 从网站下载一些 HTML 文件,但所有下载都存储在一个文件夹下。 我宁愿将它们动态存储在不同的文件夹中,比如 HTML 文件从第 1 页 go 到 folder_1 等等......

这就是我的蜘蛛的样子

import scrapy

class LearnSpider(scrapy.Spider):
    name = "learn"
    
    start_urls = ["someUrlWithIndexstart="+chr(i) for i in range(ord('a'), ord('z')+1)]

    def parse(self, response):
        for song in response.css('.entity-title'):
            songs = song.css('a ::attr(href)').get()
            yield{
                'file_urls': [songs+".html"]
            }

理想情况下,我想做的是从每个字母 go 中抓取 HTML 到每个字母的子文件夹中。

以下是我的设置文件。

BOT_NAME = 'learn'

SPIDER_MODULES = ['learn.spiders']
NEWSPIDER_MODULE = 'learn.spiders'

ROBOTSTXT_OBEY = True
ITEM_PIPELINES = {'scrapy.pipelines.files.FilesPipeline': 1}
FILES_STORE = 'downloaded_files'

任何解决方案/想法都会有所帮助,谢谢。

创建管道:

管道.py:

import os
from itemadapter import ItemAdapter
from urllib.parse import unquote
from scrapy.pipelines.files import FilesPipeline
from scrapy.http import Request


class ProcessPipeline(FilesPipeline):
    def get_media_requests(self, item, info):
        urls = ItemAdapter(item).get(self.files_urls_field, [])
        return [Request(u) for u in urls]

    def file_path(self, request, response=None, info=None, *, item=None):
        file_name = os.path.basename(unquote(request.url))
        return item['path'] + file_name

将设置中的 ITEM_PIPELINES 更改为此 class ( ITEM_PIPELINES = {'projectsname.pipelines.ProcessPipeline': 1} )

当您生成项目时,还要添加要下载到的目录的路径:

yield {
    'file_urls': [songs+".html"]
    'path': f'folder{page}'   # ofcourse you'll need to provide the page variable
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM