使用curl从网页中获取内容

时间:2012-02-26 13:00:06

标签: php curl webpage fetch

首先来看看这里,

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会话,打开文本文件逐个读取每个链接,打开它复制特定DIV中的内容,然后将其保存在新文件中。

2 个答案:

答案 0 :(得分:3)

算法很简单:

  • 使用curl
  • 下载www.zedge.net/txts/4519
  • 使用DOM(或替代方案)解析链接
  • 将它们全部存储到文本文件/数据库中,或者使用“subrequest”
  • 动态处理它们

// 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时间和内存限制

答案 1 :(得分: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[]数组中获得所需的中继名称和状态。 我在这里分享输出的screenshot

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