老蜗牛写采集:网络爬虫(一)

搞采集,那第一步离不开的肯定是蜘蛛,那我们必须的科普一下,何为网络蜘蛛?

网络爬虫

网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫

详细自己搜百度百科

 

那话又说回来了,其实说网络爬虫,术语好像好像很高大上,其实不外乎写一个http请求,然后到互联网去抓取感兴趣的数据。方式不外乎两种:一种是带有目的爬,然后抓取自己想要的数据,老牛写的蜘蛛基本上属于这种,这种蜘蛛也比较呆直萌。而另一种就高大尚一点,基于搜索索引分类的蜘蛛,这种爬行永无终点,对于互联网的一切数据都感兴趣。简直就是互联网的搬运工。不理有没有用,先采回来再说。基于老牛的道行和读者的接受程度,我们只能简单的举第一种的例子,基于目的的采集。

 

如何用C#写一个爬虫

爬虫,必须得有自己的内核,内核是啥?一个强悍的http访问组件,所幸的是微软早已帮我们准备了一个强悍的Net访问组件HttpWebRequest。有朋友会说,那不是很简单么,随便百度一下就知道怎么去写了,呃...

那我们就百度一下

            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头

如果我们要讲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,早期版本可以免费得到,最新版本要购买。

 

  C#.NET开源项目、机器学习、足球赛事资料库 

  开源Q群:302961959

  足球研究技术群:142780296

 

转载于:https://www.cnblogs.com/weitaoxiaozhu/p/6021409.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个一个俄国牛人的开源工具,为啥说他强悍了,因为他将所有Http协议的底层都实现了一遍,这有啥好处?只要你是爬虫的,都会遇到一个让人抓狂的问题,就是明明知道自己Http请求头跟浏览器一模一样了,为啥还会获取不到自己想要的数据。这时你如果使用HttpWebReaquest,你只能调试到GetRespone,底层的字节流是调试不到了。所以必须得有个更深入的底层组件,方便自己调试。以下是xNet的开源地址:https://github.com/X-rus/xNet  快速入门。      首先来一个读取cnblogs首页的案例,HttpWebRequest在上一篇已经举例,我们看看xNet是怎么的using (var request = new xNet.HttpRequest()){    var html = request.Get("http://www.cnblogs.com").ToString();}注意,默认的http头,建议用属性进行设置,譬如KeepAlive,Referer和UserAgent  扩展的Http头,譬如Upgrade-Insecure-Requests,可以使用AddHeader方法进行设置譬如using (var request = new xNet.HttpRequest()){    request.AddHeader("Upgrade-Insecure-Requests", "1");    var html=request.Get("http://www.cnblogs.com").ToString();}当然有些方法使用AddHeader和设置属性值是一样的,例如:      request.AddHeader("User-Agent","Mozilla/5.0 (Windows NT 6.3; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0");      request.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0";      request.UserAgent = xNet.Http.FirefoxUserAgent();  当然不是所有值都可以使用AddHeader进行设置,譬如:Content-Type,这是POST时说明POST的数据类型,如果使用AddHeader会报错。如果你不知道那些可以手动设那些是不能的,参考xNet.HttpHeader的枚举值public enum HttpHeader{    Accept = 0,    AcceptCharset = 1,    AcceptLanguage = 2,    AcceptDatetime = 3,    CacheControl = 4,    ContentType = 5,    Date = 6,    Expect = 7,    From = 8,    IfMatch = 9,    IfModifiedSince = 10,    IfNoneMatch = 11,    IfRange = 12,    IfUnmodifiedSince = 13,    MaxForwards = 14,    Pragma = 15,    Range = 16,    Referer = 17,    Upgrade = 18,    UserAgent = 19,    Via = 20,    Warning = 21,    DNT = 22,    AccessControlAllowOrigin = 23,    AcceptRanges = 24,    Age = 25,    Allow = 26,    ContentEncoding = 27,    ContentLanguage = 28,    ContentLength = 29,    ContentLocation = 30,    ContentMD5 = 31,    ContentDisposition = 32,    ContentRange = 33,    ETag = 34,    Expires = 35,    LastModified = 36,    Link = 37,    Location = 38,    P3P = 39,    Refresh = 40,    RetryAfter = 41,    Server = 42,    TransferEncoding = 43,}当然他还支持Socks4和Socks5,代理的好处不言而喻了  标签:.net爬虫
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值