извлечение контента с веб-страницы с помощью curl - PullRequest
1 голос
/ 26 февраля 2012

Прежде всего, посмотрите здесь,

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 ]

3 голосов
/ 26 февраля 2012

Алгоритм довольно прост:

  • скачать 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 и ограничение памяти
2 голосов
/ 28 августа 2017

Я использовал 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 вывода.

Если вы хотите прочитать все сообщения на главной странице.затем сначала нужно собрать все ссылки для отдельных сообщений.Затем вы можете использовать его для дальнейшего процесса.

...