snoopy php网页抓取工具(构建搜索引擎/网络蜘蛛组合的最佳实践说明书(1))
优采云 发布时间: 2022-02-15 04:06snoopy php网页抓取工具(构建搜索引擎/网络蜘蛛组合的最佳实践说明书(1))
关闭。这个问题需要更加集中。它目前不接受答案。
想要改善这个问题?更新问题,使其仅关注编辑此帖子的一个问题。
关闭 6 年。
改进这个问题
重要提示:以下问题无意破坏任何数据版权。所有抓取和保存的数据都直接链接到源。
对于客户,我正在采集有关构建搜索引擎/网络蜘蛛组合的信息。我确实有一些对内部链接的网页进行深度索引的经验。我也有从网页抓取数据的经验。但是,在这种情况下,数量超出了我的经验,因此我希望从最佳实践中获得一些知识和见解。
首先需要说明的是,客户端会提供一个网站的列表,会被索引。所以,它实际上是一个垂直搜索引擎。结果只需要一个链接、标题和描述(就像谷歌如何显示结果)。这个搜索引擎的主要目的是让访问者更容易搜索大量的网站和结果以找到他们正在寻找的东西。所以:网站A 收录一堆链接 -> 保存所有带有元数据的链接。
其次,有一个更具体的搜索引擎。还索引所有指向(称为)文章 的链接,这些链接分布在许多较小的站点上,其中 文章比垂直搜索引擎中的站点 @> 少。原因很简单:这些页面上的 文章 必须尽可能详细地刮掉。这就是第一个问题所在:为每个网站写一个爬虫会花费很多时间,例如需要采集的数据有:城市名、文章日期、< @文章 标题。所以:网站B比网站A收录更详细的文章s,我们将对这些文章s进行索引并抓取有用的数据。
我确实有一个可行的方法,但它涉及为每个人编写一个刮板网站,事实上,这是我现在能想到的唯一解决方案。由于每个页面的 DOM 是完全不同的,我没有看到一个选项来构建一个万无一失的算法来搜索 DOM 并“知道”页面的哪一部分是位置(但是......如果你可以匹配文本,一种可能性)用于完整的城市列表)。
我想到了几件事:
垂直搜索引擎
对于垂直搜索引擎,这很简单,我们有一个需要索引的网页列表,抓取所有匹配正则表达式的页面并将这些 URL 的完整列表存储在数据库中应该非常简单。我可能想将保存页面数据(元描述、标题等)分离到一个单独的进程中以加快索引速度。由于 网站 有匹配结果/文章,因此该搜索引擎中可能存在重复数据。我还没有决定如何过滤这些重复,可能是关于 文章 标头,但是重复的标头在数据来自的业务部门之间差异很大,但不同 文章
页面抓取
只要我们知道与 URL 匹配的正则表达式,就可以用类似的方式对“待抓取”页面进行索引。我们可以将 URL 列表保留在数据库中,并使用单独的进程运行所有单独的页面,基于 URL,爬虫现在应该使用什么正则表达式来匹配页面上所需的详细信息并将其写入数据库就足够了。网站已准备好对结果进行索引,所以我认为应该有一种方法可以创建一种爬取算法,该算法知道如何读取页面,而不必完全匹配正则表达式。就像我之前说的:如果我有一个完整的城市名称列表,则必须有一个选项来使用搜索算法来获取城市名称,而不必说城市名称位于“#content .about .city”中。
数据冗余
爬虫/爬虫的一个重要部分是防止它索引重复数据。我想要做的是跟踪爬虫何时开始索引 网站 以及索引何时结束,然后我还跟踪 文章 的“最后更新时间”(基于 文章 的 URL ) 并删除任何早于爬网开始时间的 文章。因为据我所知,这些 文章 已经不存在了。
使用页面抓取器更容易实现数据冗余,因为我的客户列出了“良好来源”(阅读:具有唯一 文章 的页面)。数据冗余对于垂直搜索引擎来说更加困难,因为被索引的站点具有从“好来源”中自我选择的手动搜索。因此,多个站点可以从同一来源中进行选择。
如何使结果可搜索
除了如何爬取页面之外,这是一个问题,因为一旦所有数据都存储在数据库中,就需要能够高速搜索。与一些竞争相比,我的客户发现要保存的数据量仍然未知,与我的客户相比,该记录建议大约 10,000 条较小的记录(垂直搜索),可能更详细的 4,000 条较大的信息记录。
我知道与您可能正在使用的某些数据库相比,这仍然是一个很小的数字。但最终,用户最多可以使用 10 到 20 个搜索字段来查找他们正在寻找的内容。由于高流量和大量搜索,我可以想象使用常规 MySQL 查询进行搜索不是一个聪明的主意。
到目前为止,我已经找到了 SphinxSearch 和 ElasticSearch。我没有使用过它们中的任何一个,也没有真正研究过两者的可能性,我唯一知道的是两者都应该在数据量大和大型搜索查询中表现良好。
综上所述
综上所述,这是我的问题的简短列表:
有没有一种简单的方法可以创建匹配 DOM 数据的搜索算法,而无需指定内容所在的确切 div?我应该拆分抓取 URL 并保存页面标题/描述以提高速度,抓取页面(链接、标题和描述)的最佳做法是什么?是否有针对 PHP 的开箱即用解决方案,可以在数据库中找到(可能)重复数据(即使存在细微差异,例如:如果 80% 匹配 -> 标记为重复)以创建面向未来的搜索数据引擎的最佳方法是什么(请记住,随着 网站 流量和搜索请求的增加,数据量可能会增加)
我希望我弄清楚了一切,对不起这么多文字。我想这确实表明我花了一些时间试图自己解决问题。