最近在摸索爬虫相关的东西,写点随笔,以便忘记。html
目的与用途程序员
现实的项目中,咱们须要太多的第三方接口了。而每每这些第三方接口因为条件限制,一时拿不到。web
譬如:浏览器
1. 淘宝网今天有什么特价商品。服务器
2. 百度今天的热搜榜是什么。网络
3. 某用户的水电、话费、煤气有没有欠费,欠了多少。mvc
等等问题,怎么办呢?app
解决不了就请程序员出马,由于程序员是万能的,程序员是无敌的。dom
原理工具
既然咱们没有能力(财力)与阿里巴巴、百度等第三方作对接,那么咱们能够经过模拟访问他们对于的页面,并抓取对应的数据,来收集相关的信息。
这里,模拟是关键,也有不少细节要处理。后面我会一一讲解。
工具
工欲善其事,兵线利器。 想要模拟访问他人的网页,爬取对应的数据, 那么咱们首先要了解对应的网页作了什么动做,如何了解,这里我介绍我用过的三种工具。
1. IE的开发人员工具
IE的开发人员工具,在打开IE的时候,按“F12”能直接呼出,并选择“网络” > "开始捕捉"
对于抓包功能,须要IE的版本达到9或者9以上。 IE8不支持抓包功能。
优势: IE自带,很是方便。
缺点: IE9和IE11的界面风格还有点不同。 IE11对于数据的拷贝很是不方便。 IE9用着感受还行。至少数据能拷贝。 可是我有个较复杂的数据爬取,它竟然漏了关键的post。
建议: 只支持IE的网站,而且相对较简单的数据爬取,能够直接选择此工具。
2. CHROME的开发人员工具
google的开发人员工具仍是不错的。一样的按F12能呼出,或者按 CTRL+Shift+I也能呼出。
一样的选择“网络” 便可捕捉 操做当前页面的数据包。
优势: 浏览器自带
缺点: 暂时没发现。
3. httpwatch
前段时间的一次抓包,一直抓不到,后来想到多是IE开发人员工具的问题,下了这个试试。 结果挺不错的。比较专业。
优势: 抓包很全面
缺点: 须要自行安装
若是是新手,我建议使用CHOROME的开发工具,或者httpwatch。
相关的类
原则上,只要实现HTTP协议的类,应该均可以, C#与抓包有关的类我用了2个,基本知足须要了。
WebClient 类,
此类使用很是简单, 直接提交页面参数与URL便可得到对应的页面输出内容。 可是若是涉及到客户端与服务端的会话保持(如:须要登陆后才能看到的数据)的状况,就无勇武之地了。对于WebClient的用法
HttpWebRequest & HttpWebResponse
这两个类是较底层的类,若是须要与服务器保持会话。就须要靠这兄弟两了。
据说其余语言抓包相对简单, 而C#相对繁琐,也是由于她,谁让他那么底层的呢,并且据说还稍微有BUG,但我没遇到。
HtmlAgilityPack
此类属于第三方类,请自行百度。 固然也不必定须要用。 须要看作出的爬虫须要爬的数据多很少,若是只想获取页面中一两个字段,彻底不须要用。
咱们知道,使用爬虫爬出来的是一大串字符串, 但其实他就是html标记的字符串, 咱们很是但愿用js来操做dom元素。 惋惜C#中,并无这样的功能。而这个第三方类,就是实现了将html标记的字符串,直接转换成了相似DOM同样的对象。 这样,咱们就能轻松获取查找对应的数据值了。
hello world
因为后面还会说到模拟登陆、文件传输等相关信息,这里我用HttpWebRequest 类来讲明。
以博客园首页列表的数据为例:
static void Main(string[] args) { string html= Hello(); Console.WriteLine(html); Console.Read(); } static string Hello() { //列表数据,通常经过抓包工具,点击下一页,来发现共同的规则,从而找到对应的URL string url = "http://www.cnblogs.com/mvc/AggSite/PostList.aspx"; //根据抓包工具,获取须要POST的数据, 并分析对应的数值, 明细这里PageIndex:1 是指第二页。其余的暂不作分析 string postData = "{ \"CategoryType\":\"SiteHome\",\"ParentCategoryId\":0,\"CategoryId\":808,\"PageIndex\":1,\"TotalPostCount\":4000,\"ItemListActionName\":\"PostList\"}"; //1.构建Request HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); req.Method = "POST";// POST OR GET, 若是是GET, 则没有第二步传参,直接第三步,获取服务端返回的数据 req.AllowAutoRedirect = false;//服务端重定向。通常设置false req.ContentType = "application/x-www-form-urlencoded";//数据通常设置这个值,除非是文件上传 //2.同过流的形式,传输参数。 byte[] postBytes = Encoding.UTF8.GetBytes(postData); req.ContentLength = postBytes.Length; Stream postDataStream = req.GetRequestStream(); postDataStream.Write(postBytes, 0, postBytes.Length); postDataStream.Close(); //3. 获取服务器端的返回数据。 HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); string html = new StreamReader(resp.GetResponseStream()).ReadToEnd(); return html; }
最简单的模拟抓包,主要3步
1. 构建HttpWebRequest。
2. 构建须要传输的参数
3. 获取HttpWebResponse
参考文献:
http://www.cnblogs.com/hambert/p/6118299.html
http://www.crifan.com/emulate_login_website_using_csharp/
https://q.cnblogs.com/q/67303/