php – 抓取具体页面和数据,使其可搜索

前端之家收集整理的这篇文章主要介绍了php – 抓取具体页面和数据,使其可搜索前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
重要提示:以下问题并不意味着破坏任何数据版权.所有已抓取和保存的数据都直接链接到源.

嗨,大家好!

对于客户端,我正在收集建立搜索引擎/网络蜘蛛组合的信息.我确实有一个索引网页的内部链接具有特定深度的经验.我也有从刮刮网页数据的经验.但是,在这种情况下,体积比我有经验更大,所以我希望获得一些知识和洞察力的最佳做法.

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

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

我确实有一种方法在我的脑海里可能有效,但这涉及到为每个网站写一个刮板,其实这是我现在唯一可以想到的解决方案.由于每个页面的DOM完全不同,我没有看到没有选择构建一个愚蠢的算法,搜索DOM并“知道”页面的哪个部分是一个位置(但是,如果您可以匹配文本,这是一种可能性反对完整的城市列表).

一些我想到的东西:

垂直搜索引擎

>对于垂直搜索引擎,它很简单,我们有一个需要索引的网页列表,抓取与正则表达式匹配的所有页面应该是相当简单的,并将这些URL的完整列表存储在数据库中.
>我可能想将保存页面数据(元描述,标题等)分割成一个单独的过程,以加快索引.
>由于具有匹配结果/文章的网站,有可能在此搜索引擎中存在重复的数据.我没有想到如何过滤这些重复项目,也许在文章标题上,但在业务部门,数据来自重复的标题,但不同的文章有巨大的变化

页面

只要我们知道哪些正则表达式与URL匹配,就可以按照类似的方式对’被剪贴页’进行索引.我们可以将URL列表保存在数据库
>使用运行所有单独页面的单独进程,根据URL,刮刀现在应该使用哪些正则表达式来匹配页面上所需的详细信息,并将其写入数据库
>有足够的网站已经对结果进行索引,所以我猜测应该有一种方法可以创建一个知道如何读取页面的刮擦算法,而不必完全匹配正则表达式.如前所述:如果我有完整的城市名称列表,那么必须有选择使用搜索算法来获取城市名称,而不用说城市名称位于“#content .about .city”中.

数据冗余

蜘蛛/抓取工具的重要部分是防止它对索引重复的数据.我希望做的是跟踪爬网程序开始索引网站的时间,何时结束,然后我还会跟踪文章的“上次更新时间”(根据文章的URL)并删除所有比抓取开始时间更早的文章.因为据我看,这些文章已经不存在了.

由于我的客户列出了“好的来源”(阅读:具有独特文章页面),因此页面刮刀的数据冗余更容易.垂直搜索引擎的数据冗余更加困难,因为索引的网站已经自己选择了“好的资源”.所以有一个机会,多个网站从相同的来源选择.

如何使结果可搜索

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

我知道,与您可能正在开展的一些数据库相比,这仍然是一小部分.但是最终可能有10-20个搜索字段,用户可以使用它们来查找他们正在寻找的内容.由于流量高,搜索量很多,我可以想象,使用常规的MySQL查询搜索并不是一个聪明的想法.

到目前为止,我发现了SphinxSearch和ElasticSearch.我没有和任何人一起工作,并没有真正研究两者的可能性,只有我知道的是,两者都应该在数据中的大量和更大的搜索查询中表现良好.

总结一下

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

>有没有一种简单的方法来创建能够匹配DOM数据的搜索算法,而无需指定内容所在的确切div?
>抓取网页的最佳做法是什么(链接,标题和说明)
>我应该分割抓取网址并保存页面标题/描述速度吗?
> PHP是否有现成的解决方案可以在数据库中找到(可能)复制数据(即使存在微小差异,如:如果80%匹配 – >标记为重复)
>为数据创建未来证明搜索引擎的最佳方式是什么(请记住,数据量可以增加网站流量和搜索请求的数量)

我希望我把所有内容都清楚了,我很抱歉文字大量.我想它确实表明我花了一些时间来试图弄清楚自己.

我有建立大型Web刮刀的经验,可以证明在进行这项任务时总会有很大的难题来克服.网络刮板存在从cpu问题到存储到网络问题的问题,任何自定义刮刀都需要建立足够的模块,以防止一部分的更改破坏整个应用程序.在我的项目中,我采取了以下方法

Figure out where your application can be logically split up

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

> Web Scraper Manager
> Web Scraper
> HTML处理器

那么这样的工作可以这样划分:

1) The Web Scraper Manager

Web Scraper Manager将URL拖到被抓取并产生Web Scraper. Web Scraper Manager需要将发送到网络刮板的所有URL标记为“被积极刮刮”,并且知道在处于该状态时不再将其拉下来.在收到来自刮板的消息后,如果没有发生错误,管理员删除该行或将其置于“主动刮除”状态,否则将重置为“不活动”

2) The Web Scraper

网页抓取工具会收到一个URL,然后浏览并下载HTML.然后,所有这些HTML都可以存储在具有以下结构的关系数据库

ID | URL | HTML (BLOB) | PROCESSING

处理是指示数据当前是否正在被处理的整数标志.这使得其他解析器知道如果已经在查看数据,则不会拉数据.

3) The HTML Processor

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.

What are the advantages?

这种方法的优点是,在任何时候,如果您想要更改方式来提取数据,处理数据或存储数据,您只需更改该部分即可,而无需重新构建整个应用程序.此外,如果刮刀/应用的一部分断裂,其余部分可以继续运行而没有任何数据丢失,而不停止其他过程

What are the disadvantages?

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

猜你在找的PHP相关文章