如何制作应该属于自己的搜索引擎?源码+教程

日期: 栏目:源码 浏览:2708 评论:0

如何制作应该属于自己的搜索引擎?源码+教程-第1张图片-Ceacer网络

如何制作应该属于自己的搜索引擎?源码+教程-第2张图片-Ceacer网络

如何制作应该属于自己的搜索引擎?源码+教程-第3张图片-Ceacer网络

如何制作应该属于自己的搜索引擎?源码+教程-第4张图片-Ceacer网络

介绍

该项目尚未完成。您必须使用它来抓取数千个 URL,因为您可能会发现它在过去 100 次中抓取相同的 URL。(这是因为相对 URL 与绝对 URL 转换过程中存在一些未识别的问题。)

 

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

例如:

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

如何制作应该属于自己的搜索引擎?源码+教程-第5张图片-Ceacer网络

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

如何制作应该属于自己的搜索引擎?源码+教程-第6张图片-Ceacer网络

http://www.w3schools.com 标签云

如何制作应该属于自己的搜索引擎?源码+教程-第7张图片-Ceacer网络

标签云如何突出显示可以描述给定 URL 的关键词是显而易见的。

现在,这些关键字存储在数据库中,然后用于查找给定关键字的相关 URL。

背景

这一切都是从我的朋友向我展示他的搜索引擎(在 XML 文件中包含 4 个 URL)开始的。它看起来像是一个自动完成功能,而不是一个搜索引擎,但那天晚上晚些时候,时间是凌晨 2:00,我根本无法入睡,因为自动完成功能给我留下了太深刻的印象。我想要我自己的……我的脑海里闪过无数的想法。经过三个不眠之夜,第三天早上6:00,我已经准备好用我的搜索引擎处理数据库中的 100 个 URL... 那时我终于舒舒服服地睡了一觉,心满意足。我花了3天时间,因为每天我都从头开始,因为我对爬虫的性能不满意或者出现了一些问题。

使用代码

我基本上把每项任务都分成了小部分,这样工作就变得容易了。所以你会在项目中发现很多类。

下面给出了一些重要的类:

  • Panda->get_sourcecode(url)它使用来自 Module ' '的模块检索给定 URL 的源代码func,然后将其传递给juicer(类)以提取有用的信息,工作完成后,向panda_manger (所有pandas 的老板)报告并再次分配一份新工作(panda 如果有的话)。

  • panda_manger->它管理所有的pandas,并且从这个类中我们分配任何用于爬行的 Web URL,它会自动将此工作分配给任何空闲的panda ,如果没有panda 空闲的,则它会创建一个新的panda 并将工作分配给它。当 apanda 完成时,它会工作并报告,然后panda_manger 检查panda_manger 是否有任何 URL 需要爬行,如果有的话,它会发出命令来爬行该 URL 到panda.

  • juicer->这个可以说是整个爬虫的主要类,它从任意网站的源代码中提取关键词,然后保存到数据库中。

  • juicer-> extract_juice->该类获取源代码,然后将其转换为HtmlAgilityPack.HtmlDocument 使用方法LoadHtml(source)使用它是因为我们需要一个 HTML 解析器来从 HTML 中删除文本(构建自定义解析器将需要大量时间),并且由于它支持 xpath 从源中检索任何元素,因此它大大简化了我们的工作。
    现在我们将 传递HtmlDocument.DocumentNode(.SelectNodes)给此类的各种方法以提取某种类型的信息。

数据库结构

首先,我们有 4 个表存储在Crawler默认名为“”的数据库中。

表名称:“关键字索引”

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

如何制作应该属于自己的搜索引擎?源码+教程-第8张图片-Ceacer网络

如何制作应该属于自己的搜索引擎?源码+教程-第9张图片-Ceacer网络

对于多个关键字,我们首先将关键字从“”中分离出来,然后找到该单词的urlhash,然后找到urlhash中包含的其他单词并显示该单词。{尚未实现,因为我遇到了不明错误,如果我使用 SQL join,那么在数据库中搜索 1 个关键字需要超过 1 分钟的时间,并且时间呈指数级增长。}

表名称:“Keyword_list”

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

如何制作应该属于自己的搜索引擎?源码+教程-第10张图片-Ceacer网络

表名称:“url_webpage”

该表用于存储迄今为止在其抓取的页面中找到的所有链接。在此表中,我们还使用 URL 的 MD5 哈希值来引用该 URL,而不是原始 URL,因为没有人知道我们可能找到的 URL 有多长。所以我们将其更改为MD5,因为无论URL有多长,MD5总是32个字符长。

如何制作应该属于自己的搜索引擎?源码+教程-第11张图片-Ceacer网络

表名称:“url_image”

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

所以我现在不会讨论它。但我想说这需要大量的处理能力。


如何制作应该属于自己的搜索引擎?源码+教程-第12张图片-Ceacer网络

爬行器的工作原理

如何制作应该属于自己的搜索引擎?源码+教程-第13张图片-Ceacer网络

兴趣点

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

 

<hr /><h3>Currently Crawler is not following robots.txt so be careful while crawling.</h3><h3>It is you responsibility if crawling a site which is not to be crawled.   </h3><p>Sorry, but currently i am working on a new model of crawler. </p>

执照

本文以及任何相关的源代码和文件均根据代码项目开放许可证 (CPOL)获得许可

一些常见的问题:

1、创建数据库表时出现问题:

CREATE TABLE `keyword_index` (
  `word` varchar(100) NOT NULL,
  `freq` int(3) NOT NULL,  UNIQUE KEY `word` (`word`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;CREATE TABLE `keyword_list` (
  `word` varchar(100) NOT NULL,
  `urlhash` char(32) NOT NULL,
  `freq` int(3) NOT NULL,
  `per_in_site` int(3) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=latin1;CREATE TABLE `url_image` (
  `urlhash` char(32) NOT NULL,
  `url` varchar(250) NOT NULL,
  `state` int(2) NOT NULL,
  `crawl_date` datetime DEFAULT NULL,
  `backlink` int(3) NOT NULL,
  `priority` int(1) NOT NULL,
  `title` varchar(500) NOT NULL,  UNIQUE KEY `urlhash` (`urlhash`),  UNIQUE KEY `url` (`url`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;CREATE TABLE `url_webpage` (
  `urlhash` char(32) NOT NULL,
  `url` varchar(250) NOT NULL,
  `state` int(2) NOT NULL,
  `crawl_date` datetime DEFAULT NULL,
  `backlink` int(3) NOT NULL,
  `priority` int(1) NOT NULL,
  `title` varchar(500) NOT NULL,  UNIQUE KEY `urlhash` (`urlhash`),  UNIQUE KEY `url` (`url`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

2、编辑程序exe文件:

如果你想更改用户名、密码、主机、表名、数据库名,那么你可以转到Crawler_Code\sql\sql.vb 这就是它的样子

如果您想更改数据库结构,您只需做很少的工作。

Crawler_Code\sql\Link_Manger.vb  //修改这个文件

Crawler_Code\sql\keyword_manger.vb //修改这个文件

因为表结构和列名称被硬编码到其中。

Protected Friend _database As String = "crawler"  //数据库名
Protected Friend _table_name As String '= "url_image"
Protected Friend _table_structure '= " urlhash char(32) not null unique, url varchar(250) not null unique, state int(2) not null  , crawl_date datetime ,backlink int(3) not null ,priority int(1) not null "
Protected Friend _host As String = "localhost"
Protected Friend _username As String = "root"  //数据库账号
Protected Friend _password As String = "root"  //数据库密码

3、我需要做什么才能使这个爬虫遵循 robots.txt 和站点地图文件:

爬虫只能访问公开可见的页面。

对于以下 robots.txt,您可以在抓取新域之前获取 robots.txt 并将其保存在某处,

现在每次抓取该域时,您都应该检查 robots.txt 文件,如果您被允许抓取以下链接或不是。

http://www.robotstxt.org/robotstxt.html


下载地址:

文件下载
资源名称:搜索引擎源代码文件大小:204.43 KB

标签:

评论留言

我要留言

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。发布前请先查看评论规则:点我查看