请教爬虫问题

2017-01-11 22:22:00 +08:00
 xiaoshangmin

之前抓数据 都是简单的 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

2638 次点击
所在节点    PHP
21 条回复
rekulas
2017-01-25 13:15:19 +08:00
强烈建议多线程抓取别用 php ,效率真心低,学下 JAVA 最多半天到一天就可以做一个请求器, PHP 负责任务分发和管理, java 只负责请求,或者用其他的真正多线程编程语言

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

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

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

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

© 2021 V2EX