Scrapy:关于使用多条管线的一些问题

Scrapy:关于使用多条管线的一些问题,scrapy,scrapy-pipeline,Scrapy,Scrapy Pipeline,我是个新手,几天前我开始了一个简单的项目。我已经成功地实现了items.py,my_spider.py和piplines.py以将一些信息刮到json文件中。现在我想给我的爬行器添加一些功能,并遇到了一些问题 我已经在一个论坛的帖子上抓取了想要的信息,包括文件URL和图像URL。我对本教程有点困惑,以下是我文件中的相关部分: **settings.py** ... ITEM_PIPELINES = { 'my_project.pipelines.InfoPipeline': 300,

我是个新手,几天前我开始了一个简单的项目。我已经成功地实现了
items.py
my_spider.py
piplines.py
将一些信息刮到json文件中。现在我想给我的爬行器添加一些功能,并遇到了一些问题

我已经在一个论坛的帖子上抓取了想要的信息,包括
文件URL
图像URL
。我对本教程有点困惑,以下是我文件中的相关部分:

**settings.py**
...
ITEM_PIPELINES = {
    'my_project.pipelines.InfoPipeline': 300,
    'scrapy.pipelines.images.ImagesPipeline': 300,
    'scrapy.pipelines.files.FilesPipeline': 300,
}
FILES_STORE = './Downloads'
IMAGES_STORE = './Downloads'
现在我可以成功下载图像,但文件没有下载。我的json文件也被最后的图像URL覆盖

因此,以下是我的问题:

  • 一个蜘蛛可以使用多条管线吗?如果可能的话,使用它们的最佳方式是什么(例如,在我的例子中,一些例子会很好!)
  • 在某些情况下,某些
    json_item['xxx']
    不会出现在某些线程上,控制台会打印一些报告问题的信息。我试着在每行代码上使用
    try-except
    ,但它变得非常难看,我相信应该有更好的方法来做到这一点。最好的方法是什么

  • 非常感谢。

    1-是的,您可以使用多个管道,但需要注意它们的调用顺序。(更多信息)

    如果要处理不同的Item对象,则只需检查
    process\u Item
    方法中接收的Item的类别。处理你想要的,把其他的原封不动地退回

    2-错误是什么,没有这些信息就帮不了什么忙。请发布执行日志

    **items.py**
    ...
    class InfoIterm(scrapy.Item):
        movie_number_title = scrapy.Field()
        movie_pics_links = scrapy.Field()
        magnet_link = scrapy.Field()
        torrent_link = scrapy.Field()
        torrent_name = scrapy.Field()
    
    
    class TorrentItem(scrapy.Item):
        file_urls = scrapy.Field()
        files = scrapy.Field()
    
    
    class ImageItem(scrapy.Item):
        image_urls = scrapy.Field()
        images = scrapy.Field()
    
    **piplines.py**
    ...
    def process_item(self, item, spider):
        contents = json.dumps(dict(item), indent=4, sort_keys=True, ensure_ascii=False)
        with open("./threads_data.json", "wb") as f:
            f.write(contents.encode("utf-8"))
        return item
    
    **my_spider.py**
    ...
    def parse_thread(self, response):
        json_item = InfoIterm()
        json_item['movie_number_title'] = response.xpath("//span[@id='thread_subject']/text()").getall()
        json_item['movie_pics_links'] = response.xpath("//td[@class='t_f']//img/@file").getall()
        json_item['magnet_link'] = response.xpath("//div[@class='blockcode']/div//li/text()").getall()
        json_item['torrent_name'] = response.xpath("//p[@class='attnm']/a/text()").getall()
        json_item['torrent_link'] = self.base_url + response.xpath("//p[@class='attnm']/a/@href").getall()[0]
        yield json_item
    
        torrent_link = self.base_url + response.xpath("//p[@class='attnm']/a/@href").getall()
        yield {'file_urls': torrent_link}
    
        movie_pics_links = response.xpath("//td[@class='t_f']//img/@file").getall()
        yield {'image_urls': movie_pics_links}