Python 的数据持久化很原始吗? - V2EX
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
ShangKai

Python 的数据持久化很原始吗?

  •  
  •   ShangKai 2016 年 9 月 22 日 4416 次点击
    这是一个创建于 3500 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我是 Python 新手,最近想用 scrapy 框架写一个爬虫,爬到的数据想保存到数据库里,网上搜了一下发现 Python 的数据持久化好原始啊,还要自己写代码显式连接数据库,然后拼接 SQL 执行,太原始了。最近又刚好在做一个 php 的 Laravel 项目,感觉 Laravel 的数据持久化好方便啊,而且我爬到的数据最终还是要用 Laravle 做一个网站来展示。所以我就想让 scrapy 爬到的 item 直接传给 Laravel 。

    考虑了几种方案,但是感觉不够优雅,大家有没有更好的方法?

    1.在 scrapy 里,当爬到 item 之后,做一个 http request 请求, URL 是 laravel 项目的某个 route ,然后把 item 以 json 的格式作为 request 的 post 参数传给 php 的 laravel 框架。

    2.发现 Redis 的 Pub/Sub , Laravel 框架又原生支持 Redis ,能否先在 php 里订阅一个消息,然后在 Python 里用 Redis publish 这个消息,这样 php 里就能收到这个消息了?这种好想不行把,因为 php 是脚本语言,不会有进程一直处于监听状态,谁来启动 php 的进程去订阅并监听消息呢?但是 laravle 里的 Redis 又有 subscribe 接口,这个是干毛啊?咋用啊?

    3.还有什么其他流行的进程间通信方案吗?

    18 条回复    2016-09-23 14:31:31 +08:00
    sunbeams001
        1
    sunbeams001  
       2016 年 9 月 22 日   1
    ipconfiger
        2
    ipconfiger  
       2016 年 9 月 22 日
    骚年, 你用的百度吧
    ShangKai
        3
    ShangKai  
    OP
       2016 年 9 月 22 日
    感谢回复,我是倾向于不在 Python 里做数据持久化的,标题有点不准确。因为在保存到数据库里之前有一些业务逻辑处理,想和最终展示这些数据的 laravel 项目放在一起便于维护。

    我好像明白了,(其实 php 我也是新手),什么进程间通信, php 在没人访问它的时候就是一堆文本文件放在那里,没有进程处于监听状态,所以 php 才需要和 web 服务器配合, web 服务器通过 fastcgi 执行 php 脚本。所以想要唤醒 php ,有且仅有两个地方, http request 通过 web 服务器的 fastcgi 访问,或者直接通过命令行执行 php 命令,比如 php artisan 。对 php 来说进程间通信只能它去主动问别的进程要数据,比如 php 的 Resis session 方案。你们没见过用 php 写 sockt 监听一个端口在那吧?
    9hills
        4
    9hills  
       2016 年 9 月 23 日 via iPhone
    @ShangKai 我写的第一个 PHP 程序就是 Socketserver
    111111111111
        5
    111111111111  
       2016 年 9 月 23 日
    billlee
        6
    billlee  
       2016 年 9 月 23 日
    @ShangKai 你理解得总体上正确,但每个请求从头执行,这个其实不是 php 的特性,而是 CGI 的特性。 CGI 可以只使用标准输入 /输出和环境变量传递数据,基本上可以支持任何语言。
    Laravel 的 subscribe 似乎一般是配合 websocket 用的。你这种情况下,最方便的应该还是发 http 请求过去。
    jswh
        7
    jswh  
       2016 年 9 月 23 日
    你需要 orm....
    Lonely
        8
    Lonely  
       2016 年 9 月 23 日
    我觉得你多搜搜再来发帖比较好
    sherlocktheplant
        9
    sherlocktheplant  
       2016 年 9 月 23 日
    建议 python 把爬下来的数据写成中间格式 如 json 然后 PHP 再配合 cron 定期把 json 文件入库
    sherlocktheplant
        10
    sherlocktheplant  
       2016 年 9 月 23 日
    1 、 2 其实都可以 用 2 的话 得命令行手动启动一个 php 得后台进程
    47jm9ozp
        11
    47jm9ozp  
       2016 年 9 月 23 日
    python 是个语言, Laravel 是个 php 框架……

    一楼的链接选个顺眼的库套上就好了
    xingzhi
        12
    xingzhi  
       2016 年 9 月 23 日   1
    1. 标题起错了。 Python 只是语言,它有 ORM 框架,并不原始。另外也要看数据库,如果是 MongoDB 这类的 NoSQL ,使用 Python 的 Dict 存入数据是很方便的。

    2. 方案 1 直接提交数据是比较方便的方案,但你要考虑到爬虫并发数和请求阻塞的问题, 当抓取的数据量大,请求数高的时候, web 那边入库会成为瓶颈;并且如果是同步 post 数据到 web service 去,会阻塞爬虫,因此需要异步提交请求。

    3. 建议使用消息队列的方式入库, 将 Scrapy 抓取到的数据放到队列去,另外起一个 Worker 读数据并提交到 Web Service 去(或直接入库), Pub/Sub 虽然可以做到这个效果,但不太符合这样的使用场景。 应利用 List 实现 Producer/Consumer 模式。
    gouchaoer
        13
    gouchaoer  
       2016 年 9 月 23 日 via Android
    1 , php 也可以做爬虫
    2 , laravel 我没法调试
    ShangKai
        14
    ShangKai  
    OP
       2016 年 9 月 23 日
    早上起来一看这么多回复,受宠若惊,谢谢大家的回复!

    总结一下:
    1 ,原来 php 可以写 Socketserver 啊,很奇怪,那为什么 php 一般都和 Apache 或者 Nginx 配合呢?为什么不自己监听 80 端口呢?导致我这个 php 新手误以为 php 干不了这事呢,哈哈哈。

    2 ,看来还是方案 1 比较好啊,把爬回来的 item json 化然后 post 请求到 laravel 的 web service 里,这个优点是爬虫可以和 web service 分开在不同的 Server ,不同地区,而且可以同时开多个爬虫,这可能就是所谓的解耦吧。

    3 , json 化后保存文件到本地某个目录,然后 laravle 利用 cron 定期去这个目录读取,保存到 DB ,最后删除这些 json 文件,这个方案也不错,缺点是爬取和保存到 DB 不够实时,而且最好在一个 server 上。
    lytofb
        15
    lytofb  
       2016 年 9 月 23 日
    感觉 python 真的是少很多轮子, sqlalchemy 里面竟然连最基本的 preparedstatement 都没有
    JasperYanky
        16
    JasperYanky  
       2016 年 9 月 23 日
    scrapy 和 django 配合 简直完美
    taxidriver
        17
    taxidriver  
       2016 年 9 月 23 日
    killerv
        18
    killerv  
       2016 年 9 月 23 日
    爬虫爬到的数据直接存到 MongoDB 中, MongoDB 很适合存储 json 数据。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3733 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 72ms UTC 04:27 PVG 12:27 LAX 21:27 JFK 00:27
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86