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

2016-09-22 23:00:13 +08:00
 ShangKai

我是 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.还有什么其他流行的进程间通信方案吗?

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

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

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

3. 建议使用消息队列的方式入库, 将 Scrapy 抓取到的数据放到队列去,另外起一个 Worker 读数据并提交到 Web Service 去(或直接入库), Pub/Sub 虽然可以做到这个效果,但不太符合这样的使用场景。 应利用 List 实现 Producer/Consumer 模式。
gouchaoer
2016-09-23 09:12:33 +08:00
1 , php 也可以做爬虫
2 , laravel 我没法调试
ShangKai
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
2016-09-23 11:07:09 +08:00
感觉 python 真的是少很多轮子, sqlalchemy 里面竟然连最基本的 preparedstatement 都没有
JasperYanky
2016-09-23 11:56:16 +08:00
scrapy 和 django 配合 简直完美
taxidriver
2016-09-23 12:54:17 +08:00
killerv
2016-09-23 14:31:31 +08:00
爬虫爬到的数据直接存到 MongoDB 中, MongoDB 很适合存储 json 数据。

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

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

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

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

© 2021 V2EX