在网页中搜索

时间:2010-10-02 20:33:06

标签: php

在Php中编写代码的最佳方法是在网页中搜索存储在文件中的多个单词?最好将源代码存储在文件中还是以其他方式存储?请帮忙。

1 个答案:

答案 0 :(得分:1)

最好的方法是使用谷歌:site:example.com word1 OR word2 OR word3

你想在一页上搜索吗?或者一个有多个页面的网站? 如果只有一页,我认为你可以将html代码存储在内存中而不会出现问题。 如果你确切地知道你搜索strpos for reach word可能是最快的(条件不区分大小写)。你也可以定义你自己的角色类并使用preg_match_all或其他东西......就像这样的东西会... ...

<?
$keywords = array("word1","word2","word3");
$doc = strip_tags(file_get_contents("http://www.example.com")); // remove tags to get only text
$doc = preg_replace('/\s+/', ' ',$doc); // remove multiple whitespaces...
foreach($keywords as $word) {
  $pos = stripos($doc,$word);
  if($pos !== false) {
    echo "match: ...".str_replace($word,"<em>$word</em>",substr($doc,$pos-20,50))."... \n";
  }
}
?>

类似下面的内容将会更快地执行,因为它基于使用O(1)的hashmap查找,并且不需要扫描每个关键字的整个文本...

<?
setlocale(LC_ALL, "en_US.utf8");
$keywords = array("word1","word2","word3","word4");
$doc = file_get_contents("http://www.example.com");
$doc = strtolower($doc);
$doc = preg_replace('!/\*.*?\*/!s', '', $doc);
$doc = preg_replace("/<!--.*>/i", "", $doc);
$doc = preg_replace('!<script.*?script>!s', '', $doc);
$doc = preg_replace('!<style.*?style>!s', '', $doc);
$doc = strip_tags($doc);
$doc = preg_replace('/[^0-9a-z\s]/','',$doc);
$doc = iconv('UTF-8', 'ASCII//TRANSLIT', $doc); // check if encoding is really utf8
//$doc = preg_replace('{(.)\1+}','$1',$doc); remove duplicate chars ... possible step to add even more fuzzyness
$doc = preg_split("/\s+/",trim($doc));
foreach($keywords as $word) {
  $word = strtolower($word); 
  $word = iconv('UTF-8', 'ASCII//TRANSLIT', $word);
  $key = array_search($word,$doc);
  var_dump($key);
  if($key !== false) {
    echo "match: ";
    for($i=$key;$i<=5 && isset($doc[$i]);$i++) {
      echo $doc[$i]." ";
    }
  }
} 
?>

此代码未经测试。

然而,从domdocument转储文本节点会更优雅

简单的搜索很容易。如果您想在整个网站中搜索爬行逻辑很困难。

我曾经为一家像爬虫一样工作的公司做过反向检查。

我的第一个建议是不要进行递归(例如扫描页面并跟踪所有链接并跟踪其中的所有链接,直到达到某个级别...)

而不是这样:

  • 按照您要抓取的多个级别执行for循环。

  • 设置一个包含一个条目的站点数组(起始页)

  • 将数组传递给函数下载每个链接,在那里扫描站点并在其中存储链接。 完成所有链接后返回新的链接列表数组

  • for循环中的
  • 使用函数的返回值更新数组,并再次调用该函数。

通过这种方式,您可以避免使用令人讨厌的路径,而是逐级爬网站。 还存储已经访问过的数组中的链接以跳过,不要关注外部链接,检查奇怪的url参数等。

为了将来的使用,您可以将文档存储在lucene或solr中,有些类可以将html页面转换为有意义的lucene对象并在其中进行搜索。