如何使网络爬虫在后台抓取网页


How to make Web Crawler to crawl pages in background?

我目前正在开发一个网络爬虫在PHP,它仍然是一个简单的一个,但我想知道的是我如何能使我的爬虫抓取页面在后台,不使用我的带宽,我是否必须使用一些cron作业,我希望它自动存储在数据库中的数据。

这是我所做的:

<?php 
$conn = mysqli_connect("localhost","root","","crawler") or die(mysqli_error());
ini_set('max_execution_time', 4000);
$to_crawl = "http://hootpile.com";
$c = array();
function get_links($url){
    global $c;
    $input = file_get_contents($url);
    $regexp = "<a's[^>]*href=('"??)([^'" >]*?)''1[^>]*>(.*)<'/a>";
    preg_match_all("/$regexp/siU", $input, $matches);
    $base_url = parse_url($url, PHP_URL_HOST);
    $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,2) =="//") {
            $link = substr($link, 2);
        }
        else if(substr($link,0,2) =="#") {
            $link = $url;
        }
        else if(substr($link,0,2) =="mailto:") {
            $link = "[".$link."]";
        }
        else {
            if(substr($link,0,1) != "/") {
            $link = $base_url."/".$link;
        }
        else {
            $link = $base_url.$link;
        }
        }
        if(substr($link, 0, 7)=="http://" && substr($link, 0, 8)!="https://" && substr($link, 0, 1)=="[") {
            if(substr($url, 0, 8) == "https://") {
                $link = "https://".$link;
            }
            else {
                $link = "http://".$link;
            }
        }
        //echo $link."<br />";
        if(!in_array($link,$c)) {
            array_push($c,$link);
        }
    }
}
get_links($to_crawl);
foreach ($c as $page) {
    get_links($page);
}
foreach ($c as $page) {
    $query = mysqli_query($conn,"INSERT INTO LINKS VALUES('','$page')");
    echo $page."<br />";
}
?>

你可以使用SimpleHTML Dom,但是爬行/抓取取决于网页结构。你想要存储多少数据,可能你在不同的网站上找不到相同的数据和结构。以防万一,您应该编写一些通用程序来从抓取的数据中获取数据。

您可以使用ReactPHP,因为它允许您轻松地生成一个持续运行的进程。

你也可以在文件的开头写一个hashbang:

#/usr/bin/php

赋予文件执行权限:

chmod a+x your_script_path.php

并使用cron或nohup执行。如果您想对它进行守护,那么还需要做一些工作。

我认为不应该将PHP用于爬虫/scraper,因为它不是为长时间运行的任务设计的。它会导致内存使用问题,请使用Python代替(我使用Python + BeautifulSoup + urllib for scraper)。此外,您应该使用crontab和nohup来调度后台作业。