构建基本的PHP Web爬网程序

时间:2016-06-25 16:55:53

标签: php

对PHP来说相当新,但请听我说。

想要构建一个基本遍历特定网站上所有链接的网络抓取工具 - >从中获取特定内容并从每个页面返回链接+特定信息。

从Youtube教程获得链接遍历功能:https://www.youtube.com/watch?v=KBemN_bTnHU,但似乎无法使最终部分工作,当尝试按照链接时,没有任何内容被输出(noob alert)。

以下是从网站获取链接的功能(不完全有效):

<?php

$to_crawl = "http://reteteculinare.ro";
$c = array();

function get_Links($to_crawl){
    global $c;
    $input = @file_get_contents($to_crawl);
    $base_url = parse_url($to_crawl, PHP_URL_HOST);

    $regexp = '<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>';
    preg_match_all("/$regexp/siU", $input, $matches);

    $l = $matches[2];

    foreach ($l as $link) {

        if(strpos($link, "#")) {
            $link = substr($link, 0, strpos($link, "#"));
        }

        if(substr($link, 0, 1) == "."){
            $link = substr($link, 1);
        }

        if(substr($link, 0, 7) == "http://"){
            $link = $link;
        } else if (substr($link, 0, 8) == "https://"){
            $link = $link;
        } else if (substr($link, 0, 4) == "www."){
            $link = substr($link, 4);
        } else if (substr($link, 0, 6) == "//wwww."){
            $link = substr($link, 6);
        } else if (substr($link, 0, 2) == "//"){
            $link = substr($link, 2);
        } else if (substr($link, 0, 1) == "#"){
            $link = $to_crawl;
        } else if (substr($link, 0, 7) == "mailto:"){
            $link = "[".$link."]";
        } else {
            if(substr($link, 0, 1) != "/") {
                $link = $base_url."/".$link;
            } else {
                $link = $base_url.$link;
            }
        }

        if(substr($link, 0, 4) == "www."){
                $link = substr($link, 4);
        } 

        if(substr($link, 0, 7) != "http://" && substr($link, 0, 8) != "https://" && substr($link, 0, 1) != "[") {
            $link = "http://".$link;
        } else {
            $link = "https://".$link;
        }

        if (!in_array($link, $c)) {
            array_push($c, $link);
        }

    }
}
get_links($to_crawl);

foreach ($c as $page) {
    get_links($page);
}

foreach ($c as $page) {
    echo $page."<br />";
}

?> 

代码一直有效,直到它尝试关注链接。任何线索?:D在视频中,它似乎对这个人来说很好....

最后,我的功能是从页面获取某些信息并将其保存到数组中:

<?php
include('simple_html_dom.php');

header('Content-type: text/plain');

$html = new simple_html_dom();

$page = ('http://www.reteteculinare.ro/carte_de_bucate/dulciuri/gauffre-de-liege-1687/');

$base_url = parse_url($page, PHP_URL_HOST);

function getRecipe($page) {
    global $recipe, $page, $base_url;

    $html = new simple_html_dom();

    $html->load_file($page);

    $reteta = $html->getElementById('hrecipe');

    $r_title = $reteta->children(4)->outertext;
    $r_title = strip_tags($r_title);
    $r_title = trim($r_title);

    $r_poza = $reteta->getElementById('.div_photo_reteta')->children(0)->src;
    $r_poza = $base_url.$r_poza;

    $r_ingrediente = $reteta->getElementById('#ingrediente-lista')->outertext;

    $r_preparare = $reteta->getElementById('.instructions')->children(1)->outertext;
    $r_preparare = strip_tags($r_preparare);

    // $r_durata = $reteta->getElementById('.duration')->children(0)->outertext;
    // $r_durata = preg_replace('/\s/', '', $r_durata);
    // $r_durata = strip_tags($r_durata);

    $recipe = array(
            "Titlu: " => $r_title,
            // "Durata: " => $r_durata,
            "Link Poza: " => $r_poza,
            "Ingrediente: " => $r_ingrediente,
            "Preparare: " => $r_preparare
        );
    echo '<pre>';
    print_r($recipe);
    echo '</pre>';
}

getRecipe($html);

?>

这很好用,把我想要的信息放到一个数组中 - 数据挖掘的noob方法我确定但不知道更好:)

最后,我想以某种方式连接这两个函数,以便当它遍历每个链接时,从第二个函数获取数据并返回一个包含找到数据的链接+数据的数组。

如果你们中的任何一方可以向我的方向伸出援手,我当然会很感激。

有点不知道我想要实现的目标,但我真的想学习并扩展我的知识。

干杯!

0 个答案:

没有答案