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

最近用 PHP 写爬虫,自我感觉速度效率还不错

  •  
  •   szopen · 2016-03-02 16:08:05 +08:00 · 7154 次点击
    这是一个创建于 3187 天前的主题,其中的信息可能已经有所发展或是发生改变。
    自己做一个字典 /词典库,所以使用 PHP 从两个网站爬下来, 格式化后入 MySQL 库

    总共 7W 个字 /词,全部完成大概是半小时(感谢这两个网站似乎没有做限制,网站性能也不错), CPU 利用率是在 150%( 4 核心平均 40%)左右。

    这个效率我还是能接受的,不知道有没有更快的?更快主要需要有哪些方面优化?
    36 条回复    2018-01-12 21:37:48 +08:00
    shiny
        1
    shiny  
       2016-03-02 16:09:51 +08:00
    爬虫爬太快不是作死么
    AlexaZhou
        2
    AlexaZhou  
       2016-03-02 16:12:39 +08:00
    半小时大概 1800 秒

    7W 条记录的话,如果每条记录查询一次,那么就是每秒 70000/1800 = 38 次查询,并不算快
    Strikeactor
        3
    Strikeactor  
       2016-03-02 16:13:22 +08:00
    比如复用长连接?
    AlexaZhou
        4
    AlexaZhou  
       2016-03-02 16:14:44 +08:00
    如果想更快可以多进程,异步

    PHP 并不能异步,那么多开几个进程同时爬取可能会更快一些

    ps :爬虫太快了容易被封
    zpvip
        5
    zpvip  
       2016-03-02 16:23:29 +08:00
    @szopen 请问爬的哪两个网站?
    szopen
        6
    szopen  
    OP
       2016-03-02 16:23:56 +08:00
    @AlexaZhou 你这个是查询数据库的计算, 7W 字词是入库后的数据。
    每一条数据是从别人网站上爬下来的,因为要考虑网络请求失败问题(主要有网络超时,网站 403 ,获取到的数据不全等重复请求),所有并不是 38 次查询请求
    est
        7
    est  
       2016-03-02 16:28:58 +08:00
    好像有个说法是不用 sleep(3) 的爬虫都是爬虫届的耻辱么?
    szopen
        8
    szopen  
    OP
       2016-03-02 16:28:58 +08:00
    @zpvip 字典是这个 5156edu ,词典是另一个
    szopen
        9
    szopen  
    OP
       2016-03-02 16:32:25 +08:00
    @est 嘿嘿,我多线程, 50 个索引线程,每个索引线程再开 20 个内容线程,爬取时失败等待 500 微秒,然后每失败一次递增,看来是我运气比较好
    crabRunning
        10
    crabRunning  
       2016-03-02 19:38:26 +08:00   ❤️ 1
    @AlexaZhou
    @est
    爬虫不要裸着身子爬,用 tor 或者 hornet 之类代理,身份匿名不可追踪,不断更换 ip.我用来爬过人家密码库,php 开一百个进程.24 小时不停机,从来不 sleep.
    lincanbin
        11
    lincanbin  
       2016-03-02 20:06:41 +08:00   ❤️ 1
    PHP 里 curl_multi 实现并发确实很快,以前用来爬豆瓣可以跑到 30M+。
    毕竟爬虫瓶颈不在入库,而在网络。
    只要网络可以实现并发,用什么语言写都一样。
    towser
        12
    towser  
       2016-03-02 20:32:14 +08:00
    爬出来能否分亨一份
    szopen
        13
    szopen  
    OP
       2016-03-02 21:49:04 +08:00
    @towser 数据不能共享
    cxbig
        14
    cxbig  
       2016-03-02 21:51:29 +08:00
    爬虫的效率似乎取决于对方网站有没有加限制吧。。。
    chineselittleboy
        15
    chineselittleboy  
       2016-03-02 23:02:02 +08:00 via Android
    有代码开源研究研究么
    binux
        16
    binux  
       2016-03-02 23:08:02 +08:00
    @crabRunning 为什么我用 Hornet 搜到的是 Gay Social Network !你让我搜了什么!
    yangqi
        17
    yangqi  
       2016-03-02 23:10:21 +08:00
    php 本来就是最好的语言,没什么意外啊
    crabRunning
        18
    crabRunning  
       2016-03-03 00:11:28 +08:00
    @binux 用 tor 吧, tor 还带了个 tor-browser , terminal 下还针对小白用户有个 tor-arm 。用 curl 试一下会看到类似下边的效果,做爬虫你值得拥有!
    ProxyChains-3.1 ( http://proxychains.sf.net)
    |DNS-request| ip.cn
    |S-chain|-<>-127.0.0.1:9050-<><>-4.2.2.2:53-<><>-OK
    |DNS-response| ip.cn is 40.78.110.144
    |S-chain|-<>-127.0.0.1:9050-<><>-40.78.110.144:80-<><>-OK
    当前 IP : 77.247.181.163 来自:荷兰
    crab@sb:~$ proxychains curl ip.cn
    ProxyChains-3.1 ( http://proxychains.sf.net)
    |DNS-request| ip.cn
    |S-chain|-<>-127.0.0.1:9050-<><>-4.2.2.2:53-<><>-OK
    |DNS-response| ip.cn is 40.78.110.144
    |S-chain|-<>-127.0.0.1:9050-<><>-40.78.110.144:80-<><>-OK
    当前 IP : 94.242.228.108 来自:卢森堡
    crab@sb:~$ proxychains curl ip.cn
    ProxyChains-3.1 ( http://proxychains.sf.net)
    |DNS-request| ip.cn
    |S-chain|-<>-127.0.0.1:9050-<><>-4.2.2.2:53-<><>-OK
    |DNS-response| ip.cn is 40.78.110.144
    |S-chain|-<>-127.0.0.1:9050-<><>-40.78.110.144:80-<><>-OK
    当前 IP : 149.202.98.161 来自:法国 OVH
    shiji
        19
    shiji  
       2016-03-03 00:16:50 +08:00
    我曾经用 PHP 扫过疼群的音乐库,挂在服务器慢慢扫的,后来本来想逐一下载。。。结果发现疼讯把洞补上了,,,(是年尾那次针对版权音乐的升级)
    eoo
        20
    eoo  
       2016-03-03 00:19:41 +08:00 via Android
    都是大神
    fuxkcsdn
        21
    fuxkcsdn  
       2016-03-03 00:44:08 +08:00 via Android
    @lincanbin 话说 curl_multi,如何做到开 8 个并发数,然后处理完 1 个马上再添加一个任务进去?就是保持有 8 个并发数

    之前自己封装的 curl_multi 以为能达到这种效果,但后来自己开了台 http 服务器进行测试,发现是 8 个处理完了再添加 8 个,如果 8 个中 7 个完成, 1 个卡住了,也要等到这 1 个超时才会再添加新的 8 个任务
    lincanbin
        22
    lincanbin  
       2016-03-03 00:49:17 +08:00
    @fuxkcsdn 如果你想实现这个,你应该把爬虫程序封装成一个通过传入参数发起一次抓取的 PHP ,然后用另一个 PHP 程序通过 call 之前写的 PHP 子程序,再自己通过 memcached 之类的实现一个锁。
    fuxkcsdn
        23
    fuxkcsdn  
       2016-03-03 00:56:29 +08:00 via Android
    @lincanbin 现在是用 redis 和 curl 实现类似效果,你说的封装是封装 curl_multi 还是 curl ?
    sb
        24
    sb  
       2016-03-03 01:15:01 +08:00 via iPhone   ❤️ 2
    @crabRunning 我表示很无辜 收到了提醒被 at 了……
    wd0g
        25
    wd0g  
       2016-03-03 08:28:17 +08:00
    全部排名已经查询完毕,总用时: 7306 秒,总添加: 2096164
    单线程跑 JD 商品的数据
    速度还可以,50 个 get 最慢 15 秒
    wd0g
        26
    wd0g  
       2016-03-03 08:31:18 +08:00
    @crabRunning 用代理速度很慢吧,在终端不能看见唰唰唰的显示不舒服的说
    WildCat
        27
    WildCat  
       2016-03-03 09:20:48 +08:00
    @crabRunning
    您好,请教个问题, tor 如何切换 IP ?我在 linux 用 torsocks 貌似都是同一个 IP 。
    crabRunning
        28
    crabRunning  
       2016-03-03 09:32:42 +08:00 via Android
    @sb 兄弟,你这 ID 颇有我年轻时候的风范
    crabRunning
        29
    crabRunning  
       2016-03-03 09:36:28 +08:00 via Android
    @WildCat tor 出口在国外,用 ss
    crabRunning
        30
    crabRunning  
       2016-03-03 09:41:26 +08:00 via Android
    @wd0g tor-arm 可以显示你的上下行速度,以前用的时候上下 1m 多
    sdrzlyz
        31
    sdrzlyz  
       2016-03-03 09:44:09 +08:00
    爬虫瓶颈不在并发速度啊。。。。骚年
    realpg
        32
    realpg  
       2016-03-03 09:50:51 +08:00
    对方网络如果说没有限制并发,你这弱爆了

    曾经确认发现某站没有爬虫限制,抓了整站百万的内容,也不过俩小时

    curl_multi 大法好
    miao
        33
    miao  
       2016-03-03 10:40:37 +08:00
    全世界最大的爬虫 google 蜘蛛 他们用的什么技术
    lincanbin
        34
    lincanbin  
       2016-03-03 11:54:35 +08:00
    @fuxkcsdn curl 啊
    lygmqkl
        35
    lygmqkl  
       2016-03-23 15:32:24 +08:00 via iPhone
    php curl+cli mode = 效率还可以的爬虫

    毕竟爬虫的关键不在于多快,而在于对方的限制和本地网络状况

    现在写爬虫我都习惯了 sleep 间隔了。 一来没必要太快 二来稳定更重要,多出两个小时就多两小时
    allgy
        36
    allgy  
       2018-01-12 21:37:48 +08:00
    @lincanbin curl_multi 不是真并发
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2771 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 05:46 · PVG 13:46 · LAX 21:46 · JFK 00:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.