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

 Eva绫波_772 发布于 2022-12-13 22:45

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


嗨,大家好!

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

首先,我需要明确的是,客户端将提供一个将被编入索引的网站列表.所以,实际上是一个垂直搜索引擎.结果只需要有链接,标题和说明(就像Google显示结果的方式).此搜索引擎的主要目的是使访问者更容易搜索大量网站和结果,以找到他们需要的内容. So:网站A包含一堆链接 - >将所有链接与元数据一起保存.

其次,有一个更具体的搜索引擎.也可以将所有链接编入索引(让我们称之为)文章,这些文章分布在许多较小的网站上,与最终在垂直搜索引擎中的网站相比,文章数量较少.原因很简单:在这些页面上找到的文章必须尽可能详细地删除.这是第一个问题所在:为每个网站编写一个刮刀需要花费大量时间,需要收集的数据例如是:城市名称,文章日期,文章标题.So:网站B包含比网站A更详细的文章,我们将索引这些文章并抓取有用的数据.

我的脑海中确实有一种方法可行,但这涉及为每个网站编写一个刮刀,实际上它是我现在能想到的唯一解决方案.由于每个页面的DOM完全不同,我认为没有选择构建一个傻瓜式的算法来搜索DOM并"知道"页面的哪个部分是一个位置(但是......如果你可以匹配文本,它是可能的反对完整的城市名单).

我想到的一些事情:

垂直搜索引擎

对于垂直搜索引擎,它非常简单,我们有一个需要索引的网页列表,抓取与正则表达式匹配的所有页面并将这些URL的完整列表存储在数据库中应该相当简单.

我可能希望将保存页面数据(元描述,标题等)分成单独的进程以加快索引.

由于具有匹配结果/文章的网站,此搜索引擎中可能存在重复数据.我没有考虑如何过滤这些重复项,可能是文章标题,但在数据来自的业务部门中,重复标题的重大变化,但不同的文章

页面抓取

只要我们知道匹配URL的正则表达式,就可以以类似的方式对"待删除"页面建立索引.我们可以在数据库中保存URL列表

使用一个单独的进程来运行所有单独的页面,根据URL,刮刀现在应该使用什么正则表达式来匹配页面上所需的详细信息并将这些写入数据库

有足够的网站可以对结果进行索引,所以我的猜测是应该有一种方法来创建一个知道如何读取页面而不必完全匹配正则表达式的抓取算法.正如我之前所说:如果我有完整的城市名称列表,必须有一个选项来使用搜索算法来获取城市名称,而不必说the city name lies in "#content .about .city".

数据冗余

蜘蛛/爬虫的一个重要部分是防止它索引重复数据.我希望做的是跟踪爬虫开始索引网站的时间以及何时结束,然后我还会跟踪文章的"上次更新时间"(基于文章的URL)并删除所有早于爬网开始时间的文章.因为据我所知,这些文章不再存在.

由于我的客户列出了"好的来源"(阅读:带有独特文章的页面),因此使用页面抓取工具可以更轻松地恢复数据.垂直搜索引擎的数据冗余更难,因为被索引的站点已经从"好的来源"中选择了自己的艺术作品.因此,多个站点有可能从相同的来源中进行选择.


如何使结果可搜索

这是一个除了如何抓取和抓取页面之外的问题,因为一旦所有数据都存储在数据库中,就需要高速搜索.与一些竞争相比,将要保存的数据量仍然是未知的,我的客户有大约10,000个较小记录(垂直搜索)和可能有更多详细信息的4,000个更大记录.

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

到目前为止,我已经找到了SphinxSearch和ElasticSearch.我没有和他们中的任何人合作,也没有真正研究过这两者的可能性,只有我知道的是,两者都应该在数据中的大量和更大的搜索查询中表现良好.


总结一下

总结一下,这里有一个问题的候选名单:

有没有一种简单的方法可以创建一个能够匹配DOM数据的搜索算法,而无需指定内容所在的确切div?

抓取页面的最佳做法是什么(链接,标题和说明)

我应该拆分抓取的网址并保存页面标题/说明以提高速度吗?

PHP是否有开箱即用的解决方案可以在数据库中找到(可能的)重复数据(即使存在细微差别,例如:如果80%匹配 - >标记为重复)

为数据创建面向未来的搜索引擎的最佳方法是什么(请记住,数据量可能会随着网站流量和搜索请求的增加而增加)

我希望我把所有事情都说清楚了,对于大量的文字我很抱歉.我想它确实表明我已经花了一些时间试图弄清楚自己.

1 个回答
  • 我有建立大型网络刮刀的经验,可以证明在完成这项任务时总会遇到很大的挑战.Web scraper遇到了从CPU问题到存储到网络问题的各种问题,并且需要构建足够模块化的任何自定义scraper,以防止一个部分的更改破坏整个应用程序.在我的项目中,我采取了以下方法:

    找出逻辑上可以拆分应用程序的位置

    对我来说这意味着建立3个不同的部分:

      网络刮板管理器

      网络刮板

      HTML处理器

    然后可以将工作划分为:

    1)Web Scraper Manager

    Web Scraper Manager将URL删除并生成Web Scrapers.Web Scraper Manager需要将已经发送给Web scraper的所有URL标记为"主动删除",并且知道在它们处于该状态时不再将其拉下来.收到来自刮刀的消息后,如果没有发生错误,管理员将删除该行或使其保持"主动刮"状态,否则会将其重置为"无效"

    2)网络刮板

    Web Scraper收到一个URL来抓取并进行CURLing并下载HTML.然后,所有这些HTML都可以存储在具有以下结构的关系数据库中

    ID | 网址| HTML(BLOB)| 处理

    处理是一个整数标志,表示当前是否正在处理数据.这使得其他解析器知道如果已经查看数据则不会提取数据.

    3)HTML处理器

    HTML处理器将不断从HTML表中读取,每次拉出新条目时都将行标记为活动状态.只要需要解析任何数据,HTML处理器就可以自由地对HTML进行操作.这可以链接到站点中的其他页面,这些页面可以放回到URL表中以再次启动该过程,任何相关数据(元标记等),图像等.

    解析完所有相关数据后,HTML处理器会将所有这些数据发送到ElasticSearch集群.ElasticSearch提供闪电般快速的全文搜索,通过将数据分成不同的密钥,可以更快地进行搜索:

    { 
       "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"
       ]
    }
    

    现在,您的网站/服务可以实时访问最新数据.解析器需要足够冗长以处理任何错误,因此如果它不能将数据拉出来,它可以将处理标志设置为false,或者至少将其记录在某处以便可以对其进行检查.

    有什么好处?

    这种方法的优点在于,如果您想要更改数据,处理数据或存储数据的方式,您可以随时更改该部分,而无需重新构建整个应用程序.此外,如果刮刀/应用程序的一部分中断其余部分,则可以继续运行而不会丢失任何数据并且不会停止其他过程

    有什么缺点?

    这是一个很复杂的系统.任何时候你有一个庞大的复杂系统,你要求大的复杂错误.遗憾的是,网页抓取和数据处理是一项复杂的工作,根据我的经验,无法解决这个特别复杂的问题.

    2022-12-13 23:05 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有