V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
qsbaq
V2EX  ›  问与答

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

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

    本人不才写了一个 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
        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   ·   实用小工具   ·   2845 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 15:00 · PVG 23:00 · LAX 07:00 · JFK 10:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.