首先本文并不是针对某网站来的。
我是怀有深深的xx来写的。以方便日后。
大哥大姐如果看到小弟的文章不屑一顾的话,到此就可以走了,要不我送送你。
计算机环境使用的vs2015社区版,数据库使用的MSSQL 2012(偷偷的说:使用的是网上的密钥哈。)
说一下简单的原理:
首先模拟浏览获取网页。
其次分析网页的内容。
最后根据自己的需要把数据储存在数据库中。(超级简单吧)
备注一句:如果是分布式爬虫的话,我考虑考虑哈,毕竟我还是很菜的哈。
在我使用的HTTP请求不带COOKIE。
带Cookie的代码
//------------2016-12-12编辑------------
HTTP请求携带的POST数据
using
下面代码请求HTTP。
HttpWebRequest
该HtmlString即获取的网页源代码。
其实网页源代码是真正爬虫难以处理的问题。
各个网站都有不同的网页结构。网页复杂,不规范。导致解析网页成为巨大的问题。
当然爬虫毕竟不是浏览器,但是复杂的爬虫会有浏览器的部分功能。
比如现在流行的动态网页加载。Jquery库来实现动态网页的添加。
那你的爬虫就必须能够解析简单的JS。当然认为解析js过于复杂,那我就不解析了撒(自欺欺人,技术达不到也没有办法)。
下面开始解析HTML网页:
首先我们要知道这个网页对我们哪些内容是有用的,哪些是没有用的。
这里开始我们将使用正则表达式。
用正则表达式来剔除不需要的Html。
//删除r
Htmlstring
//删除n
Htmlstring
删除rn是我在发现不规范的网页源代码中无法正确的匹配正则表达式。
所以以我的判断首先删除他们两个。(这是我认为的重点。)
//删除script
Htmlstring
//删除title
Htmlstring
//删除head
Htmlstring
//删除img
Htmlstring
//删除video
Htmlstring
我致力于提取网页中的文本。所以图片,视频,标题我一一删除。
脚本,样式。我都删除了。
重点提取网页中的超链接的地址:
string
该代码重点提取网页的中的超链接。
至于提取的超链接的地址,是直接储存至数据库的。
这儿有一个我自己体会:
如果在一个网页中提取几百上千个地址。这个地址数量是庞大的。我们需要把这些储存数据库中。所以我要一次插入上千条数据,但是数据库开销是昂贵的。所以数据库只能打开一次。
这里有个问题。如果数据库有庞大的地址库。这时我们我就需要一条一条在数据库查找是否有重复的地址。这儿注释一个数据库去重的。
using
数据库查询的时候为什么Select Top 1 。因为我们只需要在数据库确认是否有改地址。如果没有Top 1, 查询语句会把整个表遍历一次。这个根本没有必要的。如果有该地址迅速返回。这样有利于提高Select。
我们用正则表达式提取的地址。也未大不一样哈。有绝地地址的。有相对地址的(相对地址不规范的。)还有js代码的。会看的你眼花缭乱。还有地址链接中被Html解析了的。
match
地址含有&;明显就含有Html元素。故此,需要替换正常的参数连接符。
地址含有javascript:void(0);明显就是就js代码过滤掉。
地址中不规范的那就多了哈:
比如当前访问的域名的鬼脸(我的网站,嘿嘿)
里面的相对地址以“/”开头,但是我们的访问的域名鬼脸却是这个。这样的话我们就要不能把当前域名和相对地址直接连接起来。而是需要把相对地址的“/”删除掉才能连接起来。
还有绝对地址的判断我们也需要采用正则表达式来:
string
至此我认为简单的对网页源代码的提取超链接地址差不多了。
对网页重要的文本内容的提取哈:
对网页图片的提取,对网页视频的提取。都类似,也可以同时提取。
下面对于当前网页的获取:
在数据库中提取当前网页的网页来检索。我想有深度算法和广度算法。
深度爬取网页
广度爬取网页
偶认为应该两则结合才更好。
不展开了。因为展不开了哈。哈哈哈哈哈哈哈哈。。。。。。
——2016.12.31——
其实该代码属于单线程。
更新多线程代码还木有写。
但原理经典的生产者与消费者关系。
一个线程不停的下载。把下载的数据推入一个先入先出的队列。
另一个线程不停从队列中取出数据进行分析。
当然下载线程也可以多个。这时,下载线程对队列进行写的时候保持不被其他写线程使用。保持线程互斥。
好了暂时写到这里,好像还没有说的东西还多哦。不知道有没有用,反正我用它正在爬取网页。
我失业了,有没有人介绍一个工作呢??