Php 抓取特定页面和数据并使其可搜索

Php 抓取特定页面和数据并使其可搜索,php,mysql,search,web-scraping,web-crawler,Php,Mysql,Search,Web Scraping,Web Crawler,重要提示:以下问题并不意味着破坏任何数据版权。所有已爬网和保存的数据都直接链接到源 对于一个客户,我正在收集构建搜索引擎/网络蜘蛛组合的信息。我确实有索引网页的特定深度的内部链接的经验。我也有从网页上抓取数据的经验。然而,在这种情况下,数量比我的经验更大,因此我希望在最佳实践中获得一些知识和见解 首先,我需要明确的是,客户机将提供一个将被索引的网站列表。所以,事实上,垂直搜索引擎。结果只需要有一个链接、标题和描述(就像谷歌显示结果的方式)。这个搜索引擎的主要目的是让访问者更容易搜索大量的网站和

重要提示:以下问题并不意味着破坏任何数据版权。所有已爬网和保存的数据都直接链接到源


对于一个客户,我正在收集构建搜索引擎/网络蜘蛛组合的信息。我确实有索引网页的特定深度的内部链接的经验。我也有从网页上抓取数据的经验。然而,在这种情况下,数量比我的经验更大,因此我希望在最佳实践中获得一些知识和见解

首先,我需要明确的是,客户机将提供一个将被索引的网站列表。所以,事实上,垂直搜索引擎。结果只需要有一个链接、标题和描述(就像谷歌显示结果的方式)。这个搜索引擎的主要目的是让访问者更容易搜索大量的网站和结果,以找到他们需要的东西。
所以:
网站A包含大量链接->将所有链接与元数据一起保存

其次,还有一个更具体的搜索引擎。它还可以对文章的所有链接进行索引,这些文章分布在许多较小的站点上,与最终进入垂直搜索引擎的站点相比,这些站点的文章数量较少。原因很简单:在这些页面上找到的文章必须尽可能多地删减细节。这就是第一个问题所在:为每个网站编写一个刮板需要花费大量时间,需要收集的数据包括:城市名称、文章日期、文章标题<代码>所以:网站B包含比网站A更详细的文章,我们将对这些文章进行索引并收集有用的数据

我确实有一个方法在我的脑海中,这可能是可行的,但这涉及到为每个网站写一个刮板,事实上,这是我现在能想到的唯一解决办法。由于每个页面的DOM是完全不同的,我认为没有办法构建一个傻瓜式的算法来搜索DOM并“知道”页面的哪个部分是一个位置(但是……如果您可以将文本与完整的城市列表相匹配,这是一种可能性)

我想到了几件事:

垂直搜索引擎

  • 对于垂直搜索引擎来说,这非常简单,我们有一个需要索引的网页列表,对所有匹配正则表达式的页面进行爬网并将这些URL的完整列表存储在数据库中应该相当简单
  • 我可能想把保存页面数据(元描述、标题等)分成一个单独的过程来加速索引
  • 由于网站具有匹配的结果/文章,此搜索引擎中可能存在重复数据。我还没有决定如何过滤这些重复的内容,也许是在文章标题上,但在数据来源的业务领域,重复的标题和不同的文章有很大的变化
页面刮取

  • 只要我们知道与URL匹配的正则表达式,就可以用类似的方式为“待刮”页面编制索引。我们可以将URL列表保存在数据库中
  • 使用一个单独的进程运行所有单独的页面,根据URL,scraper现在应该使用什么regex来匹配页面上所需的详细信息,并将这些信息写入数据库
  • 已经有足够多的站点对结果进行了索引,所以我想应该有一种方法来创建一个刮取算法,它知道如何读取页面,而不必完全匹配正则表达式。正如我之前所说:如果我有一个完整的城市名称列表,那么必须有一个选项来使用搜索算法来获取城市名称,而不必说
    城市名称位于“#content.about.city”
数据冗余

spider/crawler的一个重要部分是防止它索引重复数据。我希望做的是跟踪爬虫开始索引网站的时间和结束时间,然后跟踪文章的“上次更新时间”(基于文章的URL),并删除所有早于爬虫开始时间的文章。因为在我看来,这些文章已经不存在了

由于我的客户列出了一个“好的来源”(阅读:包含独特文章的页面)的列表,因此使用页面刮刀可以更容易地进行数据重复。垂直搜索引擎的数据冗余更加困难,因为被索引的网站已经从“好的来源”中选择了自己的艺术作品。因此,多个站点有可能从同一来源中进行选择


如何使结果可搜索

这是一个与如何抓取和刮取页面无关的问题,因为一旦所有数据都存储在数据库中,就需要高速搜索。将要保存的数据量仍然未知,与某些竞争相比,我的客户显示大约有10000条较小的记录(垂直搜索),可能有4000条较大的记录,其中包含更详细的信息

据我所知,与您可能正在处理的某些数据库相比,这仍然是一个小数目。但最终可能会有多达10-20个搜索字段供用户使用,以查找他们正在查找的内容。有了高流量和大量此类搜索,我可以想象使用常规MySQL查询进行搜索不是一个聪明的主意

到目前为止,我已经找到了斯芬克斯搜索和弹性搜索。我没有使用过它们中的任何一个,也没有真正研究过两者的可能性,我唯一知道的是,它们在数据中的高容量和更大的搜索查询中都应该表现良好


总结一下

总而言之,以下是我的问题清单:

  • <? 
        //Get the HTML
        $page = file_get_html('http://www.google.com')
    
        //Parse the HTML
        $html = new DOMDocument();
        $html->loadHTML($page);
    
        //Get the elemnts you are intersted in... 
        $divArr = $html->getElementsByTagName('div');
        foreach($divArr as $div) {
            echo $div->nodeValue;
        }
    ?>
    
    ALL_DATA
    ____________________________________________
    | Url | Title | Description | HTML_Content |
    ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
    
    KEYWORDS
    _________________
    | URL | Keyword |
    ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
    
    KEYWORDS
    _______________________________
    | URL | Keyword | Occurrences |
    ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
    
    HOT_KEYWORDS
    _________________
    | URL | Keyword | 
    ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
    
    CACHED_RESULTS
    _________________
    | Keyword | Url |
    ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
    
    { 
       "url" : "http://example.com",
       "meta" : {
           "title" : "The meta title from the page",
           "description" : "The meta description from the page",
           "keywords" : "the,keywords,for,this,page"
       },
       "body" : "The body content in it's entirety",
       "images" : [
           "image1.png",
           "image2.png"
       ]
    }