scrapy 如何在一个 spider 中指定对应 pipeline 输出到多张表中

2017-07-04 14:10:52 +08:00
 Yingruoyuan

比如淘宝信息,spider 抓取后写入一张商品表,一张店铺表,如何把抓取到的信息指定到对应的 pipeline 来写入不同的表?网上搜索的结果大多是说要 pipeline 对应 spider,我这个应该是反过来,让 spider 指定对应的 pipeline

4305 次点击
所在节点    Python
12 条回复
seven2016
2017-07-04 14:22:13 +08:00
定义多个 item,然后在 pipline 解决就可以了
knightdf
2017-07-04 14:22:58 +08:00
if spider.name != spider1:
return item

每个 pipeline 只处理对应的 spider 数据就行了
Yingruoyuan
2017-07-04 14:32:35 +08:00
@seven2016 我有定义 item 及 pipeline 来对应不同的表结构,但是不明白在 spider 中把指定的数据输入到指定的表中?我现在遇到了所有的数据都输入到一张表中,另外一张表没有数据输入的现象
@knightdf ,可以一个 spider 抓取多个 pipeline 的数据吗?因为涉及到关联的对应关系,想一起抓下来
knightdf
2017-07-04 14:40:45 +08:00
@Yingruoyuan 可以,在不同的 parse callback 生成不同的 item 就可以了。
你理解的方式不对,pipeline 只是对所有结果做处理的一个东西,属于结果输出路径上的一个点
Yingruoyuan
2017-07-04 14:52:13 +08:00
@knightdf 我又 google 了一些资料,但是越看越迷糊了;
生成了 item 之后,yield 传递到 pipeline,在 pipelines.py 我定义了多个 class 来处理不同的数据,但我在 spider 里面获取到数据后该怎么让对应的 pipeline 来处理呢?
1130335361
2017-07-04 15:02:49 +08:00
Yingruoyuan
2017-07-04 15:06:17 +08:00
@1130335361 有指定呢,在 settings.py 里面和 spider 的 custom_settings = { 'ITEM_PIPELINES':{}}里都指定了呢,但是输出数据的时候会只输出到了一张表里,比如商品信息和店铺信息都写在了商品表里面
1130335361
2017-07-04 15:15:03 +08:00
@Yingruoyuan 代码问题?
knightdf
2017-07-04 15:18:07 +08:00
@Yingruoyuan 首先,没有“对应的 pipeline ”这个概念,pipeline 是对所有输出的 item 处理,当然你在 pipeline 里可以自己决定处理哪些 item,其次 spider 只管输出结构化的 item,不管被谁处理
Yingruoyuan
2017-07-04 15:50:26 +08:00
@1130335361 @knightdf @seven2016,谢谢各位解惑!
我找到原因了,我的问题是因为我自己写的 sqlarchemy 的 models 模块和 scrapy 的 items.py 冲突了,pipelines 里面用 models 代替了 item,所以会出现混乱的无法找到指定的 pipeline 来进行对应操作;
解决方法是在 pipelines 中只保留一个 spider 对应一个 pipelines,这个 spider 的所有数据输出都经过这一个 pipeline 来处理,然后把各个 items 加入 pipelines.py 中,再利用 item.__class__做判断是哪一种 item 数据类型,来决定插入哪张表就可以解决了
rebeccaMyKid
2017-07-04 15:58:12 +08:00
两个月 scrapy 用户来回答一下,pipeline 本来的概念应该是直线型处理数据,不分开的。遇到比较复杂的情况,比如你这种,我一般都不用 pipeline,你 pipeline 也是输出一个 csv 而已,你就自己写两个 list,爬的时候写到类的静态变量里,然后在爬虫关闭的时候,再把字符串输出写到文件里就行了。不知道对你是否有帮助?
Yingruoyuan
2017-07-04 16:09:46 +08:00
@rebeccaMyKid 谢谢,思路很有帮助;
只是我用的是 sqlarchemy 来插入到 mysql 里面,如果写入到文件里,在爬取结束之后我还是要导入到数据库的,所以在性能可以承受的情况下,直接导入可能会更省事些

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/372925

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX