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”
如何使结果可搜索 这是一个与如何抓取和刮取页面无关的问题,因为一旦所有数据都存储在数据库中,就需要高速搜索。将要保存的数据量仍然未知,与某些竞争相比,我的客户显示大约有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" ] }