制作搜索引擎
本文讨论了搜索引擎的制作。
- 下载 可执行文件 - 178.3 KB
- 下载源代码 - 21.5 KB
- 下载 PHP 文件 - 6.83 KB
引言
该项目仍未完成。您必须使用它来抓取数千个 URL,因为您可能会发现它重复抓取同一个 URL 达 100 次。(这是由于相对 URL 转换为绝对 URL 时存在某个未知问题。)
与大多数搜索引擎一样,这个搜索引擎也有一个爬虫,其基本目的是检索给定 URL 的源代码,然后将内容分解成单词,我们可以用这些单词创建一个数组来表示网站的内容。这不是一种万无一失的方法,但对于包含大量单词的网站(如博客、文章或论坛等)来说,是可以奏效的。
例如
http://www.google.co.in 的标签云
http://www.wikipedia.org 的标签云
https://w3schools.org.cn 的标签云
可以看出,标签云如何突出显示可以描述给定 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”
此表用于在搜索框中提供建议结果。它包含爬虫迄今为止遇到的所有单词,并且没有重复的单词。
对于多个关键字,我们首先从“ ”处拆分关键字,然后查找该单词的 urlhash,然后查找该 urlhash 包含的其他单词,并显示这些单词。{尚未实现,因为我遇到了一个无法识别的错误,并且如果我使用 SQL join
,搜索 1 个关键字就需要 1 分钟以上,并且时间呈指数增长。}
表名:“Keyword_list”
此表包含给定 URL 标签云中的所有单词。为了识别此单词属于哪个 URL,我们将该网站的 urlhash 与单词一起存储。
表名:“url_webpage”
此表用于存储到目前为止爬取的所有页面中找到的所有链接。在此表中,我们还使用 URL 的 MD5 哈希来引用该 URL,而不是原始 URL,因为没有人知道我们可能找到的 URL 会有多长。所以我们将其更改为 MD5,因为 URL 的长度无关紧要,MD5 始终是 32 个字符长。
表名:“url_image”
此表用于存储在爬取的网页中找到的所有图像链接。它将用于图像搜索,但我尚未完成其处理和前端(PHP 代码)。
所以我现在不讨论它。但我会告诉你,这需要大量的处理能力。
爬虫如何工作
关注点
摆脱相对 URL 非常令人烦恼。我尝试了几种解析方法,但每一种最终都存在某种错误。然后我找到了一个名为 URI 的神奇类,它解决了我的所有问题,但在撰写本文时,我应该抓取 codeproject.com 并显示 CodeProject 搜索结果,然后我的爬虫遇到了一个问题,在识别出我删除了 URL 数据库后,否则我会发布截图。它类似于 /search.aspx (一些文本)(相同的文本重复)(并且随着每次抓取的次数增加而再次出现)。这可能是我的代码问题。我稍后会尝试找出问题所在并发布解决方案。
目前爬虫不遵守 robots.txt,因此在抓取时请小心。
抓取不允许抓取的网站是您的责任。
抱歉,但我目前正在开发一种新的爬虫模型。
目前爬虫不遵守 robots.txt,因此在抓取时请小心。
抓取不允许抓取的网站是您的责任。
抱歉,但我目前正在开发一种新的爬虫模型。