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
V2EX  ›  Python

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

  •  
  •   ShangKai · 2016-09-22 23:00:13 +08:00 · 3834 次点击
    这是一个创建于 2983 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我是 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-09-22 23:04:23 +08:00   ❤️ 1
    ipconfiger
        2
    ipconfiger  
       2016-09-22 23:06:06 +08:00
    骚年, 你用的百度吧
    ShangKai
        3
    ShangKai  
    OP
       2016-09-22 23:54:51 +08:00
    感谢回复,我是倾向于不在 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-09-23 00:02:24 +08:00 via iPhone
    @ShangKai 我写的第一个 PHP 程序就是 Socketserver
    111111111111
        5
    111111111111  
       2016-09-23 00:04:32 +08:00
    billlee
        6
    billlee  
       2016-09-23 00:12:06 +08:00
    @ShangKai 你理解得总体上正确,但每个请求从头执行,这个其实不是 php 的特性,而是 CGI 的特性。 CGI 可以只使用标准输入 /输出和环境变量传递数据,基本上可以支持任何语言。
    Laravel 的 subscribe 似乎一般是配合 websocket 用的。你这种情况下,最方便的应该还是发 http 请求过去。
    jswh
        7
    jswh  
       2016-09-23 00:20:29 +08:00
    你需要 orm....
    Lonely
        8
    Lonely  
       2016-09-23 00:24:37 +08:00
    我觉得你多搜搜再来发帖比较好
    sherlocktheplant
        9
    sherlocktheplant  
       2016-09-23 00:42:11 +08:00
    建议 python 把爬下来的数据写成中间格式 如 json 然后 PHP 再配合 cron 定期把 json 文件入库
    sherlocktheplant
        10
    sherlocktheplant  
       2016-09-23 00:43:12 +08:00
    1 、 2 其实都可以 用 2 的话 得命令行手动启动一个 php 得后台进程
    ooxxcc
        11
    ooxxcc  
       2016-09-23 00:46:11 +08:00
    python 是个语言, Laravel 是个 php 框架……

    一楼的链接选个顺眼的库套上就好了
    xingzhi
        12
    xingzhi  
       2016-09-23 01:57:55 +08:00   ❤️ 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-09-23 09:12:33 +08:00 via Android
    1 , php 也可以做爬虫
    2 , laravel 我没法调试
    ShangKai
        14
    ShangKai  
    OP
       2016-09-23 10:25:56 +08:00
    早上起来一看这么多回复,受宠若惊,谢谢大家的回复!

    总结一下:
    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-09-23 11:07:09 +08:00
    感觉 python 真的是少很多轮子, sqlalchemy 里面竟然连最基本的 preparedstatement 都没有
    JasperYanky
        16
    JasperYanky  
       2016-09-23 11:56:16 +08:00
    scrapy 和 django 配合 简直完美
    taxidriver
        17
    taxidriver  
       2016-09-23 12:54:17 +08:00
    killerv
        18
    killerv  
       2016-09-23 14:31:31 +08:00
    爬虫爬到的数据直接存到 MongoDB 中, MongoDB 很适合存储 json 数据。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1233 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 23:57 · PVG 07:57 · LAX 15:57 · JFK 18:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.