首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我如何建立一个爬行器,将无限地进行?

我如何建立一个爬行器,将无限地进行?
EN

Stack Overflow用户
提问于 2022-10-12 02:35:27
回答 2查看 33关注 0票数 0

我想让一个爬虫,只会一直无限地前进,直到一个网页没有链接。每次它抓取一个页面时,它都会返回网页的html,这样我就可以解析它,并从文章或p标记中获得标题、元标记和信息。我想让它看起来像这样:

代码语言:javascript
运行
复制
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个链接之后停止。

EN

回答 2

Stack Overflow用户

发布于 2022-10-12 02:40:36

你尝试了什么来推动你的进步?你需要的比上面的要多得多。您需要以下内容:

代码语言:javascript
运行
复制
// 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

票数 0
EN

Stack Overflow用户

发布于 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“似乎也指向了其他错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74035895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档