我想让一个爬虫,只会一直无限地前进,直到一个网页没有链接。每次它抓取一个页面时,它都会返回网页的html,这样我就可以解析它,并从文章或p标记中获得标题、元标记和信息。我想让它看起来像这样:
while(num_links_in_page > 0){
html = page.content
/* code to parse html */
insert_in_db(html, meta, title, info, url)
}
我正在为DB使用php、javascript和MySQL,但是我没有问题切换到python或任何其他语言,对于分布式系统我没有太多的钱,但是我需要它快速,并且不需要花20分钟来抓取5个链接,就像我现在从头开始制作的爬虫一样,它也在大约50个链接之后停止。
发布于 2022-10-12 02:40:36
你尝试了什么来推动你的进步?你需要的比上面的要多得多。您需要以下内容:
// Database Structure
CREATE TABLE 'webpage_details' (
'link' text NOT NULL,
'title' text NOT NULL,
'description' text NOT NULL,
'internal_link' text NOT NULL,
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1
<?php
$main_url="http://samplesite.com";
$str = file_get_contents($main_url);
// Gets Webpage Title
if(strlen($str)>0)
{
$str = trim(preg_replace('/\s+/', ' ', $str)); // supports line breaks inside <title>
preg_match("/\<title\>(.*)\<\/title\>/i",$str,$title); // ignore case
$title=$title[1];
}
// Gets Webpage Description
$b =$main_url;
@$url = parse_url( $b );
@$tags = get_meta_tags($url['scheme'].'://'.$url['host'] );
$description=$tags['description'];
// Gets Webpage Internal Links
$doc = new DOMDocument;
@$doc->loadHTML($str);
$items = $doc->getElementsByTagName('a');
foreach($items as $value)
{
$attrs = $value->attributes;
$sec_url[]=$attrs->getNamedItem('href')->nodeValue;
}
$all_links=implode(",",$sec_url);
// Store Data In Database
$host="localhost";
$username="root";
$password="";
$databasename="sample";
$connect=mysql_connect($host,$username,$password);
$db=mysql_select_db($databasename);
mysql_query("insert into webpage_details values('$main_url','$title','$description','$all_links')");
?>
http://talkerscode.com/webtricks/create-simple-web-crawler-using-php-and-mysql.php
发布于 2022-10-12 17:01:38
你的爬虫最慢的部分是抓取页面。这可以通过独立运行的多个进程(线程)来解决。Perl可以生成进程。PHP 8具有“并行”。Shell脚本(至少在类似Linux的OSs上)可以在“背景”中运行。我推荐10个同时进行的过程作为各种竞争资源限制之间的合理权衡,等等。
对于Perl,CPAN的“机械化”将为您完成所有的解析,并提供一系列链接。第二个最慢的部分是一次将一行插入到表中。收集它们并构建一个多行“批”INSERT
。我建议将批处理限制为100行。
您还需要避免重复爬行相同的网站。为此,我建议在每一行中包括一个TIMESTAMP
。(加上其他逻辑)
有了上面的建议,我希望每秒至少有10个新链接。也没有“50岁后停”。OTOH,有几件事可以导致减速或打嗝--巨大的页面,遥远的域,访问被拒绝等。
另外,不要在一个单一的域上敲打。也许DOS监视器在几秒钟内就看到了50个请求,并将您的IP地址列入了黑名单。因此,一定要延迟几秒钟,在跟踪链接到您最近从其中获取页面的任何域之间。
即使没有我上面的建议,你的"20“、"5”和"50“似乎也指向了其他错误。
https://stackoverflow.com/questions/74035895
复制相似问题