【问题标题】:fetching content from a webpage using curl使用 curl 从网页中获取内容
【发布时间】:2012-02-26 13:00:06
【问题描述】:

首先看看这里,

www.zedge.net/txts/4519/

这个页面有这么多短信,我希望我的脚本打开每条短信并下载它, 但我遇到了一些问题,

这是我打开页面的简单脚本,

<?php
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, "http://www.zedge.net/txts/4519");
 $contents = curl_exec ($ch);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_close ($ch);
?>

页面下载很好,但是我将如何一个一个地打开该页面内的每个短信页面并将其内容保存在文本文件中, 我知道如何使用 curl 将网页的内容保存在文本文件中,但在这种情况下,我下载的页面中有很多不同的页面,如何分别打开它们?

我有这个想法,但不知道是否可行,

下载此页面,

www.zedge.net/txts/4519

在页面内查找短信页面的所有链接并将每个链接保存到一个文本文件中(每行一个),然后运行另一个curl session,打开文本文件一个一个读取每个链接,打开它从特定 DIV 复制内容,然后将其保存在新文件中。

【问题讨论】:

    标签: php curl webpage fetch


    【解决方案1】:

    算法非常简单:

    • 使用 curl 下载 www.zedge.net/txts/4519
    • DOM(或替代)解析它的链接
    • 要么将它们全部存储到文本文件/数据库中,要么使用“子请求”即时处理它们

     

    // Load main page
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, "http://www.zedge.net/txts/4519");
    $contents = curl_exec ($ch);
    $dom = new DOMDocument();
    $dom->loadHTML( $contents);
    
    // Filter all the links
    $xPath = new DOMXPath( $dom);
    $items = $xPath->query( '//a[class=myLink]');
    
    foreach( $items as $link){
        $url = $link->getAttribute('href');
        if( strncmp( $url, 'http', 4) != 0){
            // Prepend http:// or something
        }
    
        // Open sub request
        curl_setopt($ch, CURLOPT_URL, "http://www.zedge.net/txts/4519");
        $subContent = curl_exec( $ch);
    }
    

    请参阅xPath::query 的文档和示例,注意DOMNodeList 实现了Traversable,因此您可以使用foreach

    提示:

    • 使用 curl opt COOKIE_JAR_FILE
    • 使用sleep(...)不要淹没服务器
    • 设置php时间和内存限制

    【讨论】:

    • 我对 DOM 了解不多,当我打开您为 DOM 提供的链接时,有无限的东西要阅读:O,顺便说一句,我尝试了您的代码,它显示错误警告:DOMDocument: :loadHTML() [domdocument.loadhtml]: 在第 7 行的 E:\Installations\xampp\htdocs\wp\test1.php 中作为输入提供的空字符串
    • @Xufyan 查看$contents(var_dump($contents))的内容
    • 我没找到你,搜索了很多:/你能解释一下
    • 首先你必须有正确的$contents所以你必须检查$contents是否为空......(卷曲请求成功)还有php.net/manual/en/function .curl-getinfo.php 这个与 CURLINFO_HTTP_CODE 应该返回 200
    【解决方案2】:

    我的代码部分使用了 DOM。我调用了我的愿望页面并使用getElementsByTagName('td') 过滤了数据 在这里,我想要来自设备页面的继电器状态。每次我想要更新继电器的状态。为此我使用了下面的代码。

    $keywords = array();
    $domain = array('http://USERNAME:PASSWORD@URL/index.htm');
    $doc = new DOMDocument;
    $doc->preserveWhiteSpace = FALSE;
    foreach ($domain as $key => $value) {
        @$doc->loadHTMLFile($value);
        //$anchor_tags = $doc->getElementsByTagName('table');
        //$anchor_tags = $doc->getElementsByTagName('tr');
        $anchor_tags = $doc->getElementsByTagName('td');
        foreach ($anchor_tags as $tag) {
            $keywords[] = strtolower($tag->nodeValue);
            //echo $keywords[0];
        }
    }
    

    然后我在$keywords[] 数组中获得我想要的继电器名称和状态。 我在这里分享输出的

    如果您想阅读主页中的所有消息。那么首先你必须收集单独消息的所有链接。然后你可以将它用于进一步的相同过程。

    【讨论】:

      猜你喜欢
      • 2020-08-09
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      • 2013-12-31
      • 2016-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多