之前抓数据 都是简单的 for 循环加 curl 但是现在有 800 多万条 url 要抓取 这样做就不行了 下面是一个总监给的方案
get_task.php 拿任务, post_task.php 反馈任务
get_proxy.php 拿代理, post_proxy.php 反馈代理
然后做 单线程 无限循环
1. echo "\x00"; 维持跟浏览器不会断开;
2. 检查 “ timeout.txt ”存在, 则 sleep(5) continue
3. 检查 “ stop.txt ”存在, 则 break 离开无限循环,或直接 die
4. 调用 get_proxy, get_task 获得 代理 和 任务
5. 抓数据
6. 被屏蔽,通知代理被屏蔽 从头开始
7. 拿到数据代码,更新 任务 为 完成,保存 耗用时间
10. 其他异常,记录在 任务不再执行
继续循环
谷歌了好多 php 任务队列和多进程的文章还是没搞明白
如何生成队列 是数组吗 如何派任务 怎么记录任务完成情况
php 的 worker 和 threads 如何配合使用
因为抓取的网站会封 ip 所以要用代理 怎么评估记录代理的效益 代理是否被封 被封后切换代理
本来想用框架做的 但是总监说作为一个后台这些高级编程要自己玩一边要懂 就没去搞
但是现在没什么思路 希望 v 友可以从任务队列和线程方面指点下 不要用框架和 redis
2
grimpil 2017-01-11 22:59:32 +08:00 via Android
用数据库存任务队列不行么
|
3
xiaoshangmin OP @grimpil 可以解释下任务队列吗 不太懂 如果可以用数据库最好 应该抓的数据就是存数据库的
|
4
CosimoZi 2017-01-11 23:12:15 +08:00
为什么上来就 selenium
|
5
gouchaoer 2017-01-11 23:32:30 +08:00 via Android
这个方向是错的,首先不能在 php-fpm 里面跑,需要命令行里面跑
第二 800 多万 url 不多,而且看起来就是简单封 ip 连反爬虫都没做,这个单机几十个并发爬慢点一周内搞定 别一上来就任务队列,爬了的 url/id 存数据库加索引去重就完了,不要把问题复杂化。。。代理这块估计你们没经验,买 用 guzzle 别用 curl 了。。。别用 zts 的多线程,并发老实用多进程写最简单。。。 https://www.v2ex.com/t/324309#reply73 |
6
mantouge 2017-01-12 00:38:06 +08:00
|
7
mantouge 2017-01-12 00:43:53 +08:00
|
8
spice630 2017-01-12 13:23:51 +08:00
用 golang 啊
|
9
xiaoshangmin OP @gouchaoer 我买了一个动态代理 但是抓了几百条后出现验证码 这种情况怎么处理好
|
10
gouchaoer 2017-01-12 16:25:23 +08:00
@xiaoshangmin 体现技术的地方来了,如果让菜鸟三下五除二就把数据爬了,那后端靠什么吃饭,爬虫工程师靠什么吃饭
|
11
yangxiaoluck 2017-01-12 16:42:57 +08:00
推荐开源项目 pyspider ,分布式的,连 js 渲染都可以做。
项目地址: https://github.com/binux/pyspider |
12
yangxiaoluck 2017-01-12 16:43:44 +08:00
不过你要做实时更换代理的话 需要二次开发, 修改的代码不超过 10 行
|
13
xiaoshangmin OP @yangxiaoluck 不单单换代理还要对付验证码
|
14
spice630 2017-01-12 22:05:53 +08:00
爬什么网站
|
15
xiaoshangmin OP @spice630 www.mlcc1.com 所有商品详情
|
16
spice630 2017-01-12 23:19:34 +08:00
|
17
xiaoshangmin OP @spice630 查料号 首页搜索框下面有个参数选择
|
18
xiaoshangmin OP |
19
ericgui 2017-01-14 11:16:57 +08:00
关注这个帖子。我也遇到同样的问题, foreach 对少量数据 OK 的,没问题。但我要爬 3000 万条数据,再用 foreach 就傻逼了。我也没有解决方案。
|
20
xiaoshangmin OP @ericgui 如果有解决方案的时候 可以分享下
|
21
rekulas 2017-01-25 13:15:19 +08:00
强烈建议多线程抓取别用 php ,效率真心低,学下 JAVA 最多半天到一天就可以做一个请求器, PHP 负责任务分发和管理, java 只负责请求,或者用其他的真正多线程编程语言
|