V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xiaoshangmin
V2EX  ›  PHP

请教爬虫问题

  •  1
     
  •   xiaoshangmin · 2017-01-11 22:22:00 +08:00 · 2637 次点击
    这是一个创建于 2872 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    21 条回复    2017-01-25 13:15:19 +08:00
    scnace
        1
    scnace  
       2017-01-11 22:48:34 +08:00 via Android
    grimpil
        2
    grimpil  
       2017-01-11 22:59:32 +08:00 via Android
    用数据库存任务队列不行么
    xiaoshangmin
        3
    xiaoshangmin  
    OP
       2017-01-11 23:08:00 +08:00 via iPhone
    @grimpil 可以解释下任务队列吗 不太懂 如果可以用数据库最好 应该抓的数据就是存数据库的
    CosimoZi
        4
    CosimoZi  
       2017-01-11 23:12:15 +08:00
    为什么上来就 selenium
    gouchaoer
        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
    mantouge
        6
    mantouge  
       2017-01-12 00:38:06 +08:00
    为了看小说,然后用这个库做了一个采集,
    https://github.com/jmathai/php-multi-curl
    用 cli 模式跑,测试采集两千章标题加内容的时间是 8 秒左右
    mantouge
        7
    mantouge  
       2017-01-12 00:43:53 +08:00
    spice630
        8
    spice630  
       2017-01-12 13:23:51 +08:00
    用 golang 啊
    xiaoshangmin
        9
    xiaoshangmin  
    OP
       2017-01-12 15:20:02 +08:00 via iPhone
    @gouchaoer 我买了一个动态代理 但是抓了几百条后出现验证码 这种情况怎么处理好
    gouchaoer
        10
    gouchaoer  
       2017-01-12 16:25:23 +08:00
    @xiaoshangmin 体现技术的地方来了,如果让菜鸟三下五除二就把数据爬了,那后端靠什么吃饭,爬虫工程师靠什么吃饭
    yangxiaoluck
        11
    yangxiaoluck  
       2017-01-12 16:42:57 +08:00
    推荐开源项目 pyspider ,分布式的,连 js 渲染都可以做。
    项目地址: https://github.com/binux/pyspider
    yangxiaoluck
        12
    yangxiaoluck  
       2017-01-12 16:43:44 +08:00
    不过你要做实时更换代理的话 需要二次开发, 修改的代码不超过 10 行
    xiaoshangmin
        13
    xiaoshangmin  
    OP
       2017-01-12 19:56:30 +08:00 via iPhone
    @yangxiaoluck 不单单换代理还要对付验证码
    spice630
        14
    spice630  
       2017-01-12 22:05:53 +08:00
    爬什么网站
    xiaoshangmin
        15
    xiaoshangmin  
    OP
       2017-01-12 23:14:47 +08:00 via iPhone
    @spice630 www.mlcc1.com 所有商品详情
    spice630
        16
    spice630  
       2017-01-12 23:19:34 +08:00
    xiaoshangmin
        17
    xiaoshangmin  
    OP
       2017-01-12 23:28:40 +08:00 via iPhone
    @spice630 查料号 首页搜索框下面有个参数选择
    xiaoshangmin
        18
    xiaoshangmin  
    OP
       2017-01-12 23:30:44 +08:00 via iPhone
    ericgui
        19
    ericgui  
       2017-01-14 11:16:57 +08:00
    关注这个帖子。我也遇到同样的问题, foreach 对少量数据 OK 的,没问题。但我要爬 3000 万条数据,再用 foreach 就傻逼了。我也没有解决方案。
    xiaoshangmin
        20
    xiaoshangmin  
    OP
       2017-01-14 13:45:05 +08:00 via iPhone
    @ericgui 如果有解决方案的时候 可以分享下
    rekulas
        21
    rekulas  
       2017-01-25 13:15:19 +08:00
    强烈建议多线程抓取别用 php ,效率真心低,学下 JAVA 最多半天到一天就可以做一个请求器, PHP 负责任务分发和管理, java 只负责请求,或者用其他的真正多线程编程语言
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2921 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 03:19 · PVG 11:19 · LAX 19:19 · JFK 22:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.