65.9K
CodeProject 正在变化。 阅读更多。
Home

制作搜索引擎

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.94/5 (45投票s)

2013 年 3 月 19 日

CPOL

6分钟阅读

viewsIcon

260285

downloadIcon

27793

本文讨论了搜索引擎的制作。

Search Suggest

search suggest

search page for crawler

Crawler status

引言

该项目仍未完成。您必须使用它来抓取数千个 URL,因为您可能会发现它重复抓取同一个 URL 达 100 次。(这是由于相对 URL 转换为绝对 URL 时存在某个未知问题。)

 

与大多数搜索引擎一样,这个搜索引擎也有一个爬虫,其基本目的是检索给定 URL 的源代码,然后将内容分解成单词,我们可以用这些单词创建一个数组来表示网站的内容。这不是一种万无一失的方法,但对于包含大量单词的网站(如博客、文章或论坛等)来说,是可以奏效的。

例如

http://www.google.co.in 的标签云

Tag cloud of http://www.google.co.in

http://www.wikipedia.org 的标签云

tag cloud of wikipedia.org

https://w3schools.org.cn 的标签云

tag cloud of w3schools

可以看出,标签云如何突出显示可以描述给定 URL 的关键词。

现在,这些关键词存储在数据库中,然后用于根据关键词查找相关 URL。

背景

这一切都始于我的朋友向我展示了他使用的 XML 文件中包含 4 个 URL 的搜索引擎。它看起来更像一个自动完成,而不是一个搜索引擎。但那天晚上 2 点,我完全睡不着,因为那个自动完成功能让我印象深刻。我想要我自己的……我的脑海里雷声轰鸣。经过 3 个不眠之夜,在第三天早上 6 点,我的搜索引擎就准备好了,可以处理数据库中的 100 个 URL……我终于可以舒适地睡个好觉,充满满足感。这花了 3 天时间,因为我每天都从头开始,因为我不满意爬虫的性能,或者存在一些问题。

Using the Code

我基本上将每个任务分解成小部分,以便工作更容易。所以你会发现项目中有许多类。

下面列出了一些重要的类

  • Panda-> 它使用“func”模块中的 get_sourcecode(url) 来检索给定 URL 的源代码,然后将其传递给 juicer(类)以提取有用的信息,并在工作完成后,向 panda_manger(所有 panda 的老板)报告,并再次为 panda 分配新任务(如果有)。
  • panda_manger-> 它管理所有 panda,并从这个类中,我们分配任何 Web URL 进行抓取,它将自动将此工作分配给任何空闲的 panda,如果没有 panda 空闲,则会创建一个新的 panda 并将其分配工作。当一个 panda 完成其工作并向 panda_manger 报告后,panda_manger 会检查是否还有 URL 要抓取,如果有,则向 panda 发出抓取该 URL 的命令。
  • juicer->可以说这是整个爬虫的主类,它从任何网站的源代码中提取关键词,然后将其保存到数据库中。
  • juicer->extract_juice-> 此类获取源代码,然后使用 LoadHtml(source) 方法将其转换为 HtmlAgilityPack.HtmlDocument。之所以使用它,是因为我们需要一个 HTML 解析器来从 HTML 中提取文本(构建自定义解析器需要很长时间),并且因为它支持 xpath 来从源代码中检索任何元素,这大大简化了我们的工作。
    现在我们将 HtmlDocument.DocumentNode(.SelectNodes) 传递给此类中的各种方法,以提取某种类型的信息。
    Dim doc As New HtmlAgilityPack.HtmlDocument()
    doc.LoadHtml(source)
    process_texttag(doc.DocumentNode.SelectNodes("//meta"))
    prcess_anchor(doc.DocumentNode.SelectNodes("//a"))
    process_image(doc.DocumentNode.SelectNodes("//img"))
  • juicer->process_metatag-> 目前,它只处理包含关键词的 meta 标签,然后将每个单词分配给文档中总词数的 45%,以及分配给关键词中提到但未在文档中找到的词的 30%。
  • juicer->process_anchor->如果你想让搜索引擎自动跳转到下一个链接,而无需手动输入每个链接到爬虫,那么这是最重要的部分,也是最难的部分是将相对 URL 转换为绝对 URL。但 Microsoft 用 URI 类拯救了我,该类可以轻松用于转换 URI。

数据库结构

起始点,我们有一个名为“Crawler”的数据库,其中包含 4 个表。

表名:“Keyword_index”

此表用于在搜索框中提供建议结果。它包含爬虫迄今为止遇到的所有单词,并且没有重复的单词。

mysql result for keyword_index

search suggest for a

对于多个关键字,我们首先从“ ”处拆分关键字,然后查找该单词的 urlhash,然后查找该 urlhash 包含的其他单词,并显示这些单词。{尚未实现,因为我遇到了一个无法识别的错误,并且如果我使用 SQL join,搜索 1 个关键字就需要 1 分钟以上,并且时间呈指数增长。}

表名:“Keyword_list”

此表包含给定 URL 标签云中的所有单词。为了识别此单词属于哪个 URL,我们将该网站的 urlhash 与单词一起存储。

describe keyword_list

表名:“url_webpage”

此表用于存储到目前为止爬取的所有页面中找到的所有链接。在此表中,我们还使用 URL 的 MD5 哈希来引用该 URL,而不是原始 URL,因为没有人知道我们可能找到的 URL 会有多长。所以我们将其更改为 MD5,因为 URL 的长度无关紧要,MD5 始终是 32 个字符长。

describe url_webpage

表名:“url_image”

此表用于存储在爬取的网页中找到的所有图像链接。它将用于图像搜索,但我尚未完成其处理和前端(PHP 代码)。

所以我现在不讨论它。但我会告诉你,这需要大量的处理能力。

爬虫如何工作

crawler layout

关注点

摆脱相对 URL 非常令人烦恼。我尝试了几种解析方法,但每一种最终都存在某种错误。然后我找到了一个名为 URI 的神奇类,它解决了我的所有问题,但在撰写本文时,我应该抓取 codeproject.com 并显示 CodeProject 搜索结果,然后我的爬虫遇到了一个问题,在识别出我删除了 URL 数据库后,否则我会发布截图。它类似于 /search.aspx (一些文本)(相同的文本重复)(并且随着每次抓取的次数增加而再次出现)。这可能是我的代码问题。我稍后会尝试找出问题所在并发布解决方案。

 


目前爬虫不遵守 robots.txt,因此在抓取时请小心。

抓取不允许抓取的网站是您的责任。 

抱歉,但我目前正在开发一种新的爬虫模型。


© . All rights reserved.