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}