我是 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.还有什么其他流行的进程间通信方案吗?
1
sunbeams001 2016-09-22 23:04:23 +08:00 1
|
2
ipconfiger 2016-09-22 23:06:06 +08:00
骚年, 你用的百度吧
|
3
ShangKai OP 感谢回复,我是倾向于不在 Python 里做数据持久化的,标题有点不准确。因为在保存到数据库里之前有一些业务逻辑处理,想和最终展示这些数据的 laravel 项目放在一起便于维护。
我好像明白了,(其实 php 我也是新手😄),什么进程间通信, php 在没人访问它的时候就是一堆文本文件放在那里,没有进程处于监听状态,所以 php 才需要和 web 服务器配合, web 服务器通过 fastcgi 执行 php 脚本。所以想要唤醒 php ,有且仅有两个地方, http request 通过 web 服务器的 fastcgi 访问,或者直接通过命令行执行 php 命令,比如 php artisan 。对 php 来说进程间通信只能它去主动问别的进程要数据,比如 php 的 Resis session 方案。你们没见过用 php 写 sockt 监听一个端口在那吧? |
5
111111111111 2016-09-23 00:04:32 +08:00
|
6
billlee 2016-09-23 00:12:06 +08:00
@ShangKai 你理解得总体上正确,但每个请求从头执行,这个其实不是 php 的特性,而是 CGI 的特性。 CGI 可以只使用标准输入 /输出和环境变量传递数据,基本上可以支持任何语言。
Laravel 的 subscribe 似乎一般是配合 websocket 用的。你这种情况下,最方便的应该还是发 http 请求过去。 |
7
jswh 2016-09-23 00:20:29 +08:00
你需要 orm....
|
8
Lonely 2016-09-23 00:24:37 +08:00
我觉得你多搜搜再来发帖比较好
|
9
sherlocktheplant 2016-09-23 00:42:11 +08:00
建议 python 把爬下来的数据写成中间格式 如 json 然后 PHP 再配合 cron 定期把 json 文件入库
|
10
sherlocktheplant 2016-09-23 00:43:12 +08:00
1 、 2 其实都可以 用 2 的话 得命令行手动启动一个 php 得后台进程
|
11
ooxxcc 2016-09-23 00:46:11 +08:00
python 是个语言, Laravel 是个 php 框架……
一楼的链接选个顺眼的库套上就好了 |
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 模式。 |
13
gouchaoer 2016-09-23 09:12:33 +08:00 via Android
1 , php 也可以做爬虫
2 , laravel 我没法调试 |
14
ShangKai OP 早上起来一看这么多回复,受宠若惊,谢谢大家的回复!
总结一下: 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 上。 |
15
lytofb 2016-09-23 11:07:09 +08:00
感觉 python 真的是少很多轮子, sqlalchemy 里面竟然连最基本的 preparedstatement 都没有
|
16
JasperYanky 2016-09-23 11:56:16 +08:00
scrapy 和 django 配合 简直完美
|
17
taxidriver 2016-09-23 12:54:17 +08:00
|
18
killerv 2016-09-23 14:31:31 +08:00
爬虫爬到的数据直接存到 MongoDB 中, MongoDB 很适合存储 json 数据。
|