gpt4 book ai didi

python - 将 scrapy 项目导出到不同的文件

转载 作者:太空宇宙 更新时间:2023-11-03 15:45:39 24 4
gpt4 key购买 nike

我正在从 moocs 中抓取这样的评论 one

我从那里获得了所有类(class)详细信息、5 个项目和来自每个评论本身的另外 6 个项目。

这是我的类(class)详细信息代码:

def parse_reviews(self, response):
l = ItemLoader(item=MoocsItem(), response=response)
l.add_xpath('course_title', '//*[@class="course-header-ng__main-info__name__title"]//text()')
l.add_xpath('course_description', '//*[@class="course-info__description"]//p/text()')
l.add_xpath('course_instructors', '//*[@class="course-info__instructors__names"]//text()')
l.add_xpath('course_key_concepts', '//*[@class="key-concepts__labels"]//text()')
l.add_value('course_link', response.url)
return l.load_item()

现在我想包括评论详细信息,每条评论还有 5 个项目。由于类(class)数据对于所有评论都是通用的,我想将其存储在不同的文件中,然后使用类(class)名称/ID 来关联数据。

这是我的评论项目代码:

for review in response.xpath('//*[@class="review-body"]'):
review_body = review.xpath('.//div[@class="review-body__content"]//text()').extract()
course_stage = review.xpath('.//*[@class="review-body-info__course-stage--completed"]//text()').extract()
user_name = review.xpath('.//*[@class="review-body__username"]//text()').extract()
review_date = review.xpath('.//*[@itemprop="datePublished"]/@datetime').extract()
score = review.xpath('.//*[@class="sr-only"]//text()').extract()

我尝试使用临时解决方案,返回每个案例的所有项目,但也不起作用:

def parse_reviews(self, response):
#print response.body
l = ItemLoader(item=MoocsItem(), response=response)
#l = MyItemLoader(selector=response)
l.add_xpath('course_title', '//*[@class="course-header-ng__main-info__name__title"]//text()')
l.add_xpath('course_description', '//*[@class="course-info__description"]//p/text()')
l.add_xpath('course_instructors', '//*[@class="course-info__instructors__names"]//text()')
l.add_xpath('course_key_concepts', '//*[@class="key-concepts__labels"]//text()')
l.add_value('course_link', response.url)

for review in response.xpath('//*[@class="review-body"]'):
l.add_xpath('review_body', './/div[@class="review-body__content"]//text()')
l.add_xpath('course_stage', './/*[@class="review-body-info__course-stage--completed"]//text()')
l.add_xpath('user_name', './/*[@class="review-body__username"]//text()')
l.add_xpath('review_date', './/*[@itemprop="datePublished"]/@datetime')
l.add_xpath('score', './/*[@class="sr-only"]//text()')

yield l.load_item()

该脚本的输出文件已损坏,单元格已移位且字段大小不正确。

编辑:我想在输出中有两个文件:

第一个包含:

course_title,course_description,course_instructors,course_key_concepts,course_link

第二个是:

course_title,review_body,course_stage,user_name,review_date,score

最佳答案

问题是您将所有内容混合到一个项目中,这不是正确的做法。您应该创建两个项目:MoocsItemMoocsReviewItem

然后像下面这样更新代码

def parse_reviews(self, response):
#print response.body
l = ItemLoader(item=MoocsItem(), response=response)
l.add_xpath('course_title', '//*[@class="course-header-ng__main-info__name__title"]//text()')
l.add_xpath('course_description', '//*[@class="course-info__description"]//p/text()')
l.add_xpath('course_instructors', '//*[@class="course-info__instructors__names"]//text()')
l.add_xpath('course_key_concepts', '//*[@class="key-concepts__labels"]//text()')
l.add_value('course_link', response.url)

item = l.load_item()

for review in response.xpath('//*[@class="review-body"]'):
r = ItemLoader(item=MoocsReviewItem(), response=response, selector=review)
r.add_value('course_title', item['course_title'])
r.add_xpath('review_body', './/div[@class="review-body__content"]//text()')
r.add_xpath('course_stage', './/*[@class="review-body-info__course-stage--completed"]//text()')
r.add_xpath('user_name', './/*[@class="review-body__username"]//text()')
r.add_xpath('review_date', './/*[@itemprop="datePublished"]/@datetime')
r.add_xpath('score', './/*[@class="sr-only"]//text()')

yield r.load_item()

yield item

现在你想要的是不同的项目类型进入不同的 csv 文件,这是下面的 SO 线程的回答:

How can scrapy export items to separate csv files per item

我没有测试下面的代码,但代码看起来像这样:

from scrapy.exporters import CsvItemExporter
from scrapy import signals
from scrapy.xlib.pydispatch import dispatcher


def item_type(item):
return type(item).__name__.replace('Item','').lower() # TeamItem => team

class MultiCSVItemPipeline(object):
SaveTypes = ['moocs','moocsreview']

def __init__(self):
dispatcher.connect(self.spider_opened, signal=signals.spider_opened)
dispatcher.connect(self.spider_closed, signal=signals.spider_closed)

def spider_opened(self, spider):
self.files = dict([ (name, open(CSVDir+name+'.csv','w+b')) for name in self.SaveTypes ])
self.exporters = dict([ (name,CsvItemExporter(self.files[name])) for name in self.SaveTypes])
[e.start_exporting() for e in self.exporters.values()]

def spider_closed(self, spider):
[e.finish_exporting() for e in self.exporters.values()]
[f.close() for f in self.files.values()]

def process_item(self, item, spider):
what = item_type(item)
if what in set(self.SaveTypes):
self.exporters[what].export_item(item)
return item

您需要确保 ITEM_PIPELINES 已更新以使用此 MultiCSVItemPipeline

ITEM_PIPELINES = {
'mybot.pipelines.MultiCSVItemPipeline': 300,
}

关于python - 将 scrapy 项目导出到不同的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50083638/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com