V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Yingruoyuan
V2EX  ›  Python

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

  •  
  •   Yingruoyuan · 2017-07-04 14:10:52 +08:00 · 4459 次点击
    这是一个创建于 2700 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    12 条回复    2017-07-04 16:09:46 +08:00
    seven2016
        1
    seven2016  
       2017-07-04 14:22:13 +08:00   ❤️ 1
    定义多个 item,然后在 pipline 解决就可以了
    knightdf
        2
    knightdf  
       2017-07-04 14:22:58 +08:00
    if spider.name != spider1:
    return item

    每个 pipeline 只处理对应的 spider 数据就行了
    Yingruoyuan
        3
    Yingruoyuan  
    OP
       2017-07-04 14:32:35 +08:00
    @seven2016 我有定义 item 及 pipeline 来对应不同的表结构,但是不明白在 spider 中把指定的数据输入到指定的表中?我现在遇到了所有的数据都输入到一张表中,另外一张表没有数据输入的现象
    @knightdf ,可以一个 spider 抓取多个 pipeline 的数据吗?因为涉及到关联的对应关系,想一起抓下来
    knightdf
        4
    knightdf  
       2017-07-04 14:40:45 +08:00
    @Yingruoyuan 可以,在不同的 parse callback 生成不同的 item 就可以了。
    你理解的方式不对,pipeline 只是对所有结果做处理的一个东西,属于结果输出路径上的一个点
    Yingruoyuan
        5
    Yingruoyuan  
    OP
       2017-07-04 14:52:13 +08:00
    @knightdf 我又 google 了一些资料,但是越看越迷糊了;
    生成了 item 之后,yield 传递到 pipeline,在 pipelines.py 我定义了多个 class 来处理不同的数据,但我在 spider 里面获取到数据后该怎么让对应的 pipeline 来处理呢?
    1130335361
        6
    1130335361  
       2017-07-04 15:02:49 +08:00
    Yingruoyuan
        7
    Yingruoyuan  
    OP
       2017-07-04 15:06:17 +08:00
    @1130335361 有指定呢,在 settings.py 里面和 spider 的 custom_settings = { 'ITEM_PIPELINES':{}}里都指定了呢,但是输出数据的时候会只输出到了一张表里,比如商品信息和店铺信息都写在了商品表里面
    1130335361
        8
    1130335361  
       2017-07-04 15:15:03 +08:00   ❤️ 1
    @Yingruoyuan 代码问题?
    knightdf
        9
    knightdf  
       2017-07-04 15:18:07 +08:00   ❤️ 1
    @Yingruoyuan 首先,没有“对应的 pipeline ”这个概念,pipeline 是对所有输出的 item 处理,当然你在 pipeline 里可以自己决定处理哪些 item,其次 spider 只管输出结构化的 item,不管被谁处理
    Yingruoyuan
        10
    Yingruoyuan  
    OP
       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
        11
    rebeccaMyKid  
       2017-07-04 15:58:12 +08:00
    两个月 scrapy 用户来回答一下,pipeline 本来的概念应该是直线型处理数据,不分开的。遇到比较复杂的情况,比如你这种,我一般都不用 pipeline,你 pipeline 也是输出一个 csv 而已,你就自己写两个 list,爬的时候写到类的静态变量里,然后在爬虫关闭的时候,再把字符串输出写到文件里就行了。不知道对你是否有帮助?
    Yingruoyuan
        12
    Yingruoyuan  
    OP
       2017-07-04 16:09:46 +08:00
    @rebeccaMyKid 谢谢,思路很有帮助;
    只是我用的是 sqlarchemy 来插入到 mysql 里面,如果写入到文件里,在爬取结束之后我还是要导入到数据库的,所以在性能可以承受的情况下,直接导入可能会更省事些
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2708 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 10:27 · PVG 18:27 · LAX 02:27 · JFK 05:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.