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

2023-12-02

我正在从 moocs 上抓取评论,就像这样one

从那里我可以获取所有课程详细信息,其中 5 个项目和每个评论本身的另外 6 个项目。

这是我的课程详细信息的代码:

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 个项目。 由于课程数据对于所有评论都是通用的,因此我想将其存储在不同的文件中,并使用课程名称/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()

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

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

第一个包含:

course_title,course_description,course_instructors,course_key_concepts,course_link

第二个是:

course_title,review_body,course_stage,user_name,review_date,score

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

然后更新代码如下

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 线程的答案:

scrapy如何将项目导出为每个项目单独的csv文件

我还没有测试以下内容,但代码看起来像这样:

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 class

ITEM_PIPELINES = {
    'mybot.pipelines.MultiCSVItemPipeline': 300,
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 scrapy 项目导出到不同的文件 的相关文章

  • 没有名为 crypto.cipher 的模块

    我现在正在尝试加密一段时间 我最近得到了这个基于 python 的密码器 名为PythonCrypter https github com jbertman PythonCrypter 我对 Python 相当陌生 当我尝试通过终端打开 C
  • SQLAlchemy 通过关联对象声明式多对多自连接

    我有一个用户表和一个朋友表 它将用户映射到其他用户 因为每个用户可以有很多朋友 这个关系显然是对称的 如果用户A是用户B的朋友 那么用户B也是用户A的朋友 我只存储这个关系一次 除了两个用户 ID 之外 Friends 表还有其他字段 因此
  • 将数据从 python pandas 数据框导出或写入 MS Access 表

    我正在尝试将数据从 python pandas 数据框导出到现有的 MS Access 表 我想用已更新的数据替换 MS Access 表 在 python 中 我尝试使用 pandas to sql 但收到错误消息 我觉得很奇怪 使用 p
  • 如何在flask中使用g.user全局

    据我了解 Flask 中的 g 变量 它应该为我提供一个全局位置来存储数据 例如登录后保存当前用户 它是否正确 我希望我的导航在登录后在整个网站上显示我的用户名 我的观点包含 from Flask import g among other
  • 使用带有关键字参数的 map() 函数

    这是我尝试使用的循环map功能于 volume ids 1 2 3 4 5 ip 172 12 13 122 for volume id in volume ids my function volume id ip ip 我有办法做到这一点
  • 如何使用 Ansible playbook 中的 service_facts 模块检查服务是否存在且未安装在服务器中?

    我用过service facts检查服务是否正在运行并启用 在某些服务器中 未安装特定的软件包 现在 我如何知道这个特定的软件包没有安装在该特定的服务器上service facts module 在 Ansible 剧本中 它显示以下错误
  • 如何替换 pandas 数据框列中的重音符号

    我有一个数据框dataSwiss其中包含瑞士城市的信息 我想用普通字母替换带有重音符号的字母 这就是我正在做的 dataSwiss Municipality dataSwiss Municipality str encode utf 8 d
  • 使用 Tkinter 显示 numpy 数组中的图像

    我对 Python 缺乏经验 第一次使用 Tkinter 制作一个 UI 显示我的数字分类程序与 mnist 数据集的结果 当图像来自 numpy 数组而不是我的 PC 上的文件路径时 我有一个关于在 Tkinter 中显示图像的问题 我为
  • 如何使用 OpencV 从 Firebase 读取图像?

    有没有使用 OpenCV 从 Firebase 读取图像的想法 或者我必须先下载图片 然后从本地文件夹执行 cv imread 功能 有什么办法我可以使用cv imread link of picture from firebase 您可以
  • 绘制方程

    我正在尝试创建一个函数 它将绘制我告诉它的任何公式 import numpy as np import matplotlib pyplot as plt def graph formula x range x np array x rang
  • 如何在ipywidget按钮中显示全文?

    我正在创建一个ipywidget带有一些文本的按钮 但按钮中未显示全文 我使用的代码如下 import ipywidgets as widgets from IPython display import display button wid
  • Python 的“zip”内置函数的 Ruby 等价物是什么?

    Ruby 是否有与 Python 内置函数等效的东西zip功能 如果不是 做同样事情的简洁方法是什么 一些背景信息 当我试图找到一种干净的方法来进行涉及两个数组的检查时 出现了这个问题 如果我有zip 我可以写这样的东西 zip a b a
  • IO 密集型任务中的 Python 多线程

    建议仅在 IO 密集型任务中使用 Python 多线程 因为 Python 有一个全局解释器锁 GIL 只允许一个线程持有 Python 解释器的控制权 然而 多线程对于 IO 密集型操作有意义吗 https stackoverflow c
  • 在f字符串中转义字符[重复]

    这个问题在这里已经有答案了 我遇到了以下问题f string gt gt gt a hello how to print hello gt gt gt f a a gt gt gt f a File
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • 有没有办法检测正在运行的代码是否正在上下文管理器内执行?

    正如标题所述 有没有办法做到这样的事情 def call back if called inside context print running in context else print called outside context 这将
  • 使用其构造函数初始化 OrderedDict 以便保留初始数据的顺序的正确方法?

    初始化有序字典 OD 以使其保留初始数据的顺序的正确方法是什么 from collections import OrderedDict Obviously wrong because regular dict loses order d O
  • 发送用户注册密码,django-allauth

    我在 django 应用程序上使用 django alluth 进行身份验证 注册 我需要创建一个自定义注册表单 其中只有一个字段 电子邮件 密码将在服务器上生成 这是我创建的表格 from django import forms from
  • Python 类继承 - 诡异的动作

    我观察到类继承有一个奇怪的效果 对于我正在处理的项目 我正在创建一个类来充当另一个模块的类的包装器 我正在使用第 3 方 aeidon 模块 用于操作字幕文件 但问题可能不太具体 以下是您通常如何使用该模块 project aeidon P
  • 导入错误:没有名为 site 的模块 - mac

    我已经有这个问题几个月了 每次我想获取一个新的 python 包并使用它时 我都会在终端中收到此错误 ImportError No module named site 我不知道为什么会出现这个错误 实际上 我无法使用任何新软件包 因为每次我

随机推荐

  • jqgrid - 工具栏文本 - 这是一个好方法吗?

    我已指定userdata在 JSON 响应中 取决于值title财产 标题将发生变化以反映title财产 工具栏中的文本 网格标题和数据表标题之间 将发生变化 HTML table table div div JSON colModel n
  • 如何使用 CSS 拆分表格单元格中的字符串(例如长 URL)?

    情况是这样的 我正在尝试一些 MySpace 页面自定义 如果你有曾经尝试过 stackoverflow 我相信您明白这有多么令人沮丧 基本上它可以通过 CSS 在一组特定的规则内进行自定义 例如不允许使用 字符 多么有用 看看这个blog
  • if 语句中多个条件的 Python 简写[重复]

    这个问题在这里已经有答案了 if x y z print x y 这是 if x y and y z 的简写吗 它在我的代码中有效 但我不确定当多个条件不都是 或 时如何解释 或者以上面的后一种形式写出 是的 如中所述文档 比较可以是任意链
  • 如何在 MATLAB 中为符号变量赋予数字?

    我尝试使用以下代码在 MATLAB 中声明一个符号变量 syms a 我对这个变量进行了计算 一切都很好 但我的问题是 我不知道如何给变量一个数字并得到数字结果 例如我的代码的答案是 answer exp 10 a 例如我想给 a 40并得
  • 当更新 sphinx.conf 中的索引时,总是需要在 sphinx 中重新启动 searchd 吗?

    如果我更新 sphinx conf 文件中的资源 我可以使用 rotate 重新索引 一切正常 如果我更新 sphinx conf 中的索引或添加新索引 rotate 不起作用 我必须重新启动 searchd 我这样做是否正确 我觉得 ro
  • 当不涉及真正的 I/O 调用时,异步链的所有级别是否都需要ConfigureAwait(false)?

    在 Azure Document Db Client SDK 之上实现可重用适配器类型的库 该库可以在任何地方运行 不仅可以在 ASP NET Core Web 服务中运行 还可以在命令行应用程序 ASP NET Web Api 等中运行
  • R 中的 Unicode 变量名称

    我正在开发一个玩具项目 并尝试使用一些 unicode 变量名称来匹配我试图实现的论文 以下代码在 Windows 上的 R 3 4 3 RStudio 版本 1 1 456 和 OSX 上的 R 3 5 1 上运行良好 gt lt fun
  • 如何将 Thunderbird 扩展与 Lightning 集成

    我目前正在为一个项目进行初步研究 如果可行的话 该项目将包含带有 Lightning 集成的 Thunderbird 扩展 我的问题是这样的 如何使用 Thunderbird 扩展以编程方式更改 Lightning 中的 CSS 具体来说
  • Rails 2.3.9 查询参数的编码

    是否可以让rails 将查询参数解码为utf8 如果我有类似 foo param 的东西 我尝试访问控制器中的参数 该参数被编码为 ASCII 8BIT 这会导致很多事情被破坏 因为我们的许多其他字符串都是用 UTF 8 编码的 而 rub
  • 获得授权属性的许可?

    我已经实现了我自己的Authorize属性 我注意到当我使用时它会查询以检查权限 Authorize 有什么方法可以获取该权限并在应用该权限的当前控制器中使用它Authorize属性而无需重写和重新查询控制器中的代码 是的你可以 如果您将
  • iOS 8 下不显示键盘

    当专注于我的应用程序的文本字段时 它们都无法调出键盘 我无法输入任何字母 不过iOS 8之前还可以 我尝试旋转屏幕 发现键盘显示在屏幕范围之外 检查视图框架 它是1024 768 似乎是正确的 最后发现是模拟器的问题 不是iOS 8的bug
  • 无法转换为尺寸:膨胀布局时类型=0x1 [重复]

    这个问题在这里已经有答案了 我的 XML 文件
  • 正则表达式 - 如何用 PHP 替换字符串的最后 3 个单词

    尝试将最后 3 个单词封装在 span tag str Lorem ipsum dolor sit amet h2 preg replace w s w s w span 1 span str 这里是 h2 preg replace w s
  • 使用 Pyspark 进行虚拟编码 [重复]

    这个问题在这里已经有答案了 我希望使用 Pyspark 语法将分类变量虚拟编码为数值变量 如下图所示 我读入这样的数据 data sqlContext read csv data txt sep header true 在 python 中
  • 是否需要通过 TCP 进行应用程序级重传和确认?

    我有以下疑问 1 TCP 是否保证数据包的传送 因此如果使用的传输协议是 TCP 则是否需要应用程序级重传 假设我已经在客户端和服务器之间建立了 TCP 连接 并且服务器向客户端发送消息 然而 客户端离线并仅在 10 小时后返回 那么 TC
  • 为管理仪表板创建私有路由时出错

    我尝试使用下面的代码来私有路由管理仪表板 我正在使用react router dom 6 2 2 我需要帮助来找出只能由管理员访问的私人路线 我尝试了 stackoverflow 中所有现有的解决方案 app js
  • 打字稿错误属性在类型上不存在

    我是 angularjs 2 和 ionic 2 的新手 我正在使用带有 Validators FormControl 和 FormGroup 的 angularjs 表单 当我使用 ionicserve lab 执行项目时 一切都很好 但
  • qt 错误:未定义对“线程 vtable”的引用

    我有代码 include
  • 如何通过 System.setProperty() 启动多个版本的 Geckodriver

    我不知道我是否在监督某些事情 但是是否可以在同一个 JVM 中使用多个 geckodriver 版本 问题在于 System setProperty webdriver gecko driver path of the geckodrive
  • 将 scrapy 项目导出到不同的文件

    我正在从 moocs 上抓取评论 就像这样one 从那里我可以获取所有课程详细信息 其中 5 个项目和每个评论本身的另外 6 个项目 这是我的课程详细信息的代码 def parse reviews self response l ItemL