搞采集,那第一步离不开的确定是蜘蛛,那咱们必须的科普一下,何为网络蜘蛛?html
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更常常的称为网页追逐者),是一种按照必定的规则,自动地抓取万维网信息的程序或者脚本。另一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。web
详细本身搜百度百科windows
那话又说回来了,其实说网络爬虫,术语好像好像很高大上,其实不外乎写一个http请求,而后到互联网去抓取感兴趣的数据。方式不外乎两种:一种是带有目的爬,而后抓取本身想要的数据,老牛写的蜘蛛基本上属于这种,这种蜘蛛也比较呆直萌。而另外一种就高大尚一点,基于搜索索引分类的蜘蛛,这种爬行永无终点,对于互联网的一切数据都感兴趣。简直就是互联网的搬运工。不理有没有用,先采回来再说。基于老牛的道行和读者的接受程度,咱们只能简单的举第一种的例子,基于目的的采集。浏览器
爬虫,必须得有本身的内核,内核是啥?一个强悍的http访问组件,所幸的是微软早已帮咱们准备了一个强悍的Net访问组件HttpWebRequest。有朋友会说,那不是很简单么,随便百度一下就知道怎么去写了,呃...网络
那咱们就百度一下app
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://www.cnblogs.com"); using (WebResponse wr = req.GetResponse()) { var stream = wr.GetResponseStream(); using (System.IO.StreamReader sr = new System.IO.StreamReader(stream, Encoding.UTF8)) { var html = sr.ReadToEnd(); } }
如无心外,经过以上代码咱们能够获取到博客园首页的html源码,代码简单易懂,若是爬虫就只获取一段html代码,那好像也没什么可说的。但咱们说过,咱们的爬虫是基于必定目的去采集数据的。因此只能获取一段html代码并不能知足咱们的需求。或者说,咱们若是只有能获取某个网站的首页,估计用处不大。那咱们应该怎么去获取咱们想要的页面呢?这只是一个简单的http GET方法,若是遇到POST怎么办?若是遇到windows身份认证?若是要记录Cookie怎么办?假如目标网站防采集...问题会源源不断的产生。固然只要花上必定时间,全部的问题都能在谷哥度娘找到答案,可是如何能省去一些碰壁的时间呢?这就是我这篇文章重点介绍的地方。机器学习
若是咱们要讲http协议,估计讲个几小时也讲不完,固然他也很简单,但记住几个重点,咱们即可以应付80%以上的可能。工欲善其事,必先利其器。咱们得找一个工具获取http头,否则讲这个有点抽象。这个市面上全部的浏览器几乎都有这样工具,通常打开浏览器按F12就能够看到,若是按F12没反应!呃...百度一下“Firebug”工具
那咱们看看上面代码实际产生的http头,老牛用的是Chrome浏览器,若是你用其余浏览器产生的结果不同属正常现象学习
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding:gzip, deflate, sdch Accept-Language:zh-CN,zh;q=0.8 Connection:keep-alive Host:www.cnblogs.com User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.113 Safari/537.36
Accept 代表要接受的类型,通常默认为text/html网站
Accept-Encoding 表示接收解码格式,若是对方开启了gzip则便使用gzip格式进行解码
Accept-Language 接收语言,这对于多语言网站才有用
Connection:keep-alive 长链接,基本上从Http 1.1开始就默认开启
Host 这没什么可说的,域名
若是想知道HttpWebRequest的Http头,只须要
req.Headers.ToString()
那如何跟Chrome浏览器的http头同样呢?
只需修改上面的代码
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://www.baidu.com"); req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"; req.Headers.Add("Accept-Encoding", "gzip, deflate, sdch"); req.Headers.Add("Accept-Language", "zh-CN,zh;q=0.8"); req.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.113 Safari/537.36"; using (WebResponse wr = req.GetResponse()) { var stream = wr.GetResponseStream(); using (System.IO.StreamReader sr = new System.IO.StreamReader(stream, Encoding.UTF8)) { var html = sr.ReadToEnd(); } }
而后toString()看看http头
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding: gzip, deflate, sdch Accept-Language: zh-CN,zh;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.113 Safari/537.36 Host: www.baidu.com Connection: Keep-Alive
顺序可能不一致,但不影响使用。
那为啥要跟Chrome一致?其实不少状况下,咱们不须要动http头,但世界老是没有这么便宜的事,人家辛辛苦苦维护的网站就被你几行代码爬走了,因此做为站长,怎么也得预防一些居心不良的爬虫采集本身的数据,因此有矛就有盾。至于怎么防采集就不属于这篇文章的范畴了,咱们要讲的是如何写好一个爬虫,一个让全部站长惊悚,厌恶的爬虫。
到此为止,咱们只讲了简单的get,那若是要实现登陆了?我要采集登陆后是数据了?还有获取到html源码,我怎么抽离想要的数据等等,这些可能都是写爬虫的核心问题。由于基于篇幅考虑,我不想大范围的解答以上问题,不少百度均可以找到。感受会无数的歧视眼光看过来,我裤子都脱了,你给我看这个,^_^
下一篇幅会介绍强悍的开源Http组件xNet
为啥要用第三方的开源组件?由于HttpWebRequest底层是不公开的,有时候对付防采集会很头疼,因此必须得基于Socket底层的组件才能方便咱们调试为啥获取不到html源码或者为啥获取不到跟浏览器同样的源码。
国内也有基于HttpWebRequest组件的类库,譬如苏飞写的HttpHelper,早期版本能够免费获得,最新版本要购买。
开源Q群:302961959
足球研究技术群:142780296