我目前正在使用PHP开发一个Web爬虫,它仍然是一个简单的爬虫,但我想知道的是如何让我的爬虫在后台抓取页面而不是使用我的带宽,我是否必须使用一些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 />";
}
?>
答案 0 :(得分:1)
您可以使用SimpleHTML Dom,但抓取/抓取取决于网页结构。您要存储多少数据,可能是您在不同的网站上找不到相同的数据和结构。如果您应该制作一些通用程序来从抓取数据中获取数据。
答案 1 :(得分:0)
您可以使用ReactPHP,因为它可以让您轻松生成一个持续运行的进程。
你也可以在文件的开头写一个hashbang:
#/usr/bin/php
赋予文件执行权限:
chmod a+x your_script_path.php
用cron或nohup执行它。如果你想要守护它,那么还有一些工作。
答案 2 :(得分:0)
我认为您不应该将PHP用于crawler / scraper,因为它不适用于长时间运行的任务。它会导致内存使用问题,而是使用Python(我使用Python + BeautifulSoup + urllib作为scraper)。 此外,你应该使用crontab和nohup来安排后台工作。