Невозможно захватить контент, пересекающий несколько страниц - PullRequest
0 голосов
/ 19 сентября 2018

Я написал скрипт на php для удаления titles и links с веб-страницы.Веб-страница отображает содержимое, проходящее через несколько страниц.Мой скрипт ниже может анализировать titles и links с его целевой страницы.

Как я могу исправить свой существующий скрипт, чтобы получать данные с нескольких страниц, например, до 10 страниц?

Это моя попытка до сих пор:

<?php
include "simple_html_dom.php";
$link = "https://stackoverflow.com/questions/tagged/web-scraping?page=2";
function get_content($url)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $htmlContent = curl_exec($ch);
    curl_close($ch);
    $dom = new simple_html_dom();
    $dom->load($htmlContent);
    foreach($dom->find('.question-summary') as $file){
        $itemTitle = $file->find('.question-hyperlink', 0)->innertext;
        $itemLink = $file->find('.question-hyperlink', 0)->href;
        echo "{$itemTitle},{$itemLink}<br>";
    }
}
get_content($link);
?>

Сайт увеличивает свои страницы, например ?page=2, ?page=3 и т. Д.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Так я добился успеха (справляясь с предложением Нимы ).

<?php
include "simple_html_dom.php";
$link = "https://stackoverflow.com/questions/tagged/web-scraping?page="; 

function get_content($url)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $htmlContent = curl_exec($ch);
        curl_close($ch);
        $dom = new simple_html_dom();
        $dom->load($htmlContent);
        foreach($dom->find('.question-summary') as $file){
            $itemTitle = $file->find('.question-hyperlink', 0)->innertext;
            $itemLink = $file->find('.question-hyperlink', 0)->href;
            echo "{$itemTitle},{$itemLink}<br>";
        }
    }
for($i = 1; $i<10; $i++){
        get_content($link.$i);
    }
?>
0 голосов
/ 19 сентября 2018

Вот как бы я это сделал с XPath :

$url = 'https://stackoverflow.com/questions/tagged/web-scraping';

$dom = new DOMDocument();
$source = loadUrlSource($url);
$dom->loadHTML($source);

$xpath = new DOMXPath($dom);
$domPage = new DOMDocument();
$domPage->loadHTML($source);
$xpath_page = new DOMXPath($domPage);

// Find page links with the title "go to page" within the div container that contains "pager" class.
$pageItems = $xpath_page->query("//div[contains(@class, 'pager')]//a[contains(@title, 'go to page')]");

// Get last page number. 
// Since you will look once at the beginning for the page number, subtract by 2 because the link "next" has title "go to page" as well.
$pageCount = (int)$pageItems[$pageItems->length-2]->textContent;

// Loop every page
for($page=1; $page < $pageCount; $page++) {

    $source = loadUrlSource($url . "?page={$page}");

    // Do whatever with the source. You can also call simple_html_dom on the content.
    // $dom = new simple_html_dom();
    // $dom->load($source);

}
...