介绍
该项目尚未完成。您必须使用它来抓取数千个 URL,因为您可能会发现它在过去 100 次中抓取相同的 URL。(这是因为相对 URL 与绝对 URL 转换过程中存在一些未识别的问题。)
与大多数搜索引擎一样,这个搜索引擎也有一个爬虫,其基本目标是检索给定 URL 的源代码,然后将内容分解为单词,我们可以使用这些单词创建一组代表网站内容的标签单词。这不是一个万无一失的方法,但可以适用于其中包含大量文字的网站,例如博客、文章或论坛等。
例如:
http://www.google.co.in 的标签云
http://www.wikipedia.org 的标签云
http://www.w3schools.com 标签云
标签云如何突出显示可以描述给定 URL 的关键词是显而易见的。
现在,这些关键字存储在数据库中,然后用于查找给定关键字的相关 URL。
背景
这一切都是从我的朋友向我展示他的搜索引擎(在 XML 文件中包含 4 个 URL)开始的。它看起来像是一个自动完成功能,而不是一个搜索引擎,但那天晚上晚些时候,时间是凌晨 2:00,我根本无法入睡,因为自动完成功能给我留下了太深刻的印象。我想要我自己的……我的脑海里闪过无数的想法。经过三个不眠之夜,第三天早上6:00,我已经准备好用我的搜索引擎处理数据库中的 100 个 URL... 那时我终于舒舒服服地睡了一觉,心满意足。我花了3天时间,因为每天我都从头开始,因为我对爬虫的性能不满意或者出现了一些问题。
使用代码
我基本上把每项任务都分成了小部分,这样工作就变得容易了。所以你会在项目中发现很多类。
下面给出了一些重要的类:
Panda
->get_sourcecode(url)
它使用来自 Module ' '的模块检索给定 URL 的源代码func
,然后将其传递给juicer
(类)以提取有用的信息,工作完成后,向panda_manger
(所有panda
s 的老板)报告并再次分配一份新工作(panda
如果有的话)。panda_manger
->它管理所有的panda
s,并且从这个类中我们分配任何用于爬行的 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
默认名为“”的数据库中。
表名称:“关键字索引”
该表用于在搜索框中提供建议的结果。它包含了爬虫迄今为止遇到的所有单词,并且没有重复的单词。
对于多个关键字,我们首先将关键字从“”中分离出来,然后找到该单词的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(一些文本)(相同的文本再次重复)(再次,随着每次爬行而增加)。可能是我的代码有问题。我稍后会尝试找出这个问题并发布解决方案。
<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
评论留言