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