shell 中使用 curl 抓取无限循环问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qsbaq
V2EX    问与答

shell 中使用 curl 抓取无限循环问题

  •  
  •   qsbaq 2018-11-06 23:14:37 +08:00 3034 次点击
    这是一个创建于 2540 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本人不才写了一个 WordPress 得采集插件 wp-jpost,这边遇到一些问题烦请大佬指点。

    我们抓取得内容现在是通过浏览器的跳转实现的,这样的话好处就是不会导致内存溢出之类的问题。缺点就是速度慢依赖浏览器,所以我们这里想弄一个脚本。如果直接写 php 脚本采集内容一多会内存溢出所以这里不考虑。所以看看能否在 curl 中跟随链接来循环访问页面来实现。

    每个采集的 html 中使用了 meta 进行了跳转,如:

    <meta cOntent="8; url='http://127.0.0.1/jpost/?jtask=webhtm&jpage=22'" http-equiv="refresh">

    然后这边需要很多次循环,这边我们如何使用 shell 或者 curl 如何才能循环跟随这个地址去访问页面呢。

    如果我们使用 php 再显示 html 中使用 header302,然后 header("Location:网址"); 这样可以使用 curl -L。,但是这样的话可能会导致页面内容无法执行,而直接跳转。

    求大佬指点一下。

    11 条回复    2018-11-07 11:17:40 +08:00
    l12ab
        1
    l12ab  
       2018-11-06 23:30:12 +08:00
    前两天我正好也有这个需求,供参考。

    ```
    <?php
    echo "run";
    exit(1); //用 exit 返回状态

    ?>
    ```

    windows

    ```
    @echo off
    cls
    :start
    php index.php
    if %errorlevel%==1 goto exceptionEnd
    goto start

    :exceptionEnd
    echo 结束
    pause
    ```

    linux
    ```
    while [ 1 -eq 1 ]
    do
    php abc.php
    set last_code=$?
    if [ $last_code -ne 1 ];then
    echo "task error error_code: "$last_code
    break
    fi
    done
    ```
    0ZXYDDu796nVCFxq
        2
    0ZXYDDu796nVCFxq  
       2018-11-06 23:31:21 +08:00 via Android
    虽然表达清楚了,但看起来真的很累。



    我们抓取得内容现在是通过浏览器的跳转实现的,这样的话好处就是不会导致内存溢出之类的问题。

    这里有因果关系吗?


    如果直接写 php 脚本采集内容一多会内存溢出所以这里不考虑。

    这是代码有问题啊。



    为何要用 shell 这么弱的语言做这种事?
    我觉得,你用 PHP 处理不了,改用 shell 明显更难。
    不如看下怎么解决 PHP 的内存问题。
    qsbaq
        3
    qsbaq  
    OP
       2018-11-07 10:01:18 +08:00
    @gstqc 考虑到大部分站长都是小内存鸡吧,比如 512MB 内存,1G 内存。这样的脚本跑 2-3 个小时可以么亲。
    NjcyNzMzNDQ3
        4
    NjcyNzMzNDQ3  
       2018-11-07 10:20:40 +08:00
    内存溢出?
    NjcyNzMzNDQ3
        5
    NjcyNzMzNDQ3  
       2018-11-07 10:21:40 +08:00
    是不是没 curl_close 啊
    qsbaq
      &nbp; 6
    qsbaq  
    OP
       2018-11-07 10:29:18 +08:00
    @NjcyNzMzNDQ3 用的是 snoopy,所有的参数变量我都有 unset,destory
    NjcyNzMzNDQ3
        7
    NjcyNzMzNDQ3  
       2018-11-07 10:54:40 +08:00
    @qsbaq 几年前的东西了,推荐 gayhub 上找个 xpath 的轮子吧
    qsbaq
        8
    qsbaq  
    OP
       2018-11-07 11:00:44 +08:00
    @NjcyNzMzNDQ3 还望大佬详细说明
    0ZXYDDu796nVCFxq
        9
    0ZXYDDu796nVCFxq  
       2018-11-07 11:01:05 +08:00 via Android
    @qsbaq 看你怎么用了。
    如果抓回来的内容都保存在内存,时间久了肯定会爆。
    把内容落地到磁盘就行了。

    就好比如,你一台 512M 内存的机器,怎么下载一个 20G 的文件?当然只能边下边写磁盘。
    NjcyNzMzNDQ3
        10
    NjcyNzMzNDQ3  
       2018-11-07 11:14:24 +08:00
    @gstqc 跑题了,你是想解决内存溢出。
    xpath 就一工具,抓数据比正则舒服,所以推荐你以后可以试试。
    qsbaq
        11
    qsbaq  
    OP
       2018-11-07 11:17:40 +08:00
    @gstqc 这边是直接入库到 WordPress 数据库里的。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5461 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 08:52 PVG 16:52 LAX 01:52 JFK 04:52
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86