广告位招租

.net/c# 网络爬虫优化之路

0x00

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

0x01

一般爬虫简单来说的话,就是根据自己的规则去抓取数据,把抓取的数据加以分析,然后,获取到对自己有用的数据。

0x02

网络爬虫优化可以分两个阶段:

1:在抓取数据的时候进行优化;

2:对抓取结果的处理进行优化;

今天,我们只讲在抓取过程中的优化!

0x03

抓取过程中的优化,我自己总结过几点:

1:可以在物理地址上进行优化,例如:目标资源服务器是上海的腾讯云主机,我们尽可能的选择同地域的服务器,也就是上海地域的服务器,不要去选择北京、青岛等等地域的服务器,也尽量选择同idc机房的服务器,我们知道此资源网站是用的腾讯云的服务器,我们尽可能的把爬虫放在腾讯云服务器上面,而不要放在阿里云服务器上面!

2:选择稳定、快速的网络,一般爬虫对网络质量要求较高,尽量不要使用家庭网络,选择公司网络或则购买服务器进行抓取数据。

3:选择比较高效的爬虫语言,听说python在爬虫方面比较擅长,但是,我没有用过,以后再做测试,今天,我主要是以.net语言来讲解。

0x04

对于抢购之类的东西,对抓取速度要求较高,可谓是分秒必争,早获取到数据,就多增加抢到的几率,下面是我用控制台写了一个demo,对本网站数据进行抓取的测试,如下图:

.net/c# 网络爬虫优化之路插图

(耗时越短,表示越快)

上面数据排名:1:原生优化后的代码、2:原生代码、3:第三方插件dll(包)

0x05

为什么第三方插件(包)耗时最长?第三方插件其实是对原生代码的大量封装,大量逻辑判断,通用性比较强,可能会导致抓取速度很慢。

下面是原生代码:

  1.         /// <summary>
  2.         /// 原生代码
  3.         /// </summary>
  4.         /// <param name=”url”></param>
  5.         /// <param name=”useragent”></param>
  6.         /// <returns></returns>
  7.         public static string GetHtml(string url, string useragent)
  8.         {
  9.             try
  10.             {
  11.                 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
  12.                 request.Method = “GET”;
  13.                 request.UserAgent = useragent;
  14.                 request.Timeout = 10000;
  15.                 request.AllowAutoRedirect = false;
  16.                 //对发送的数据不使用缓存
  17.                 request.AllowWriteStreamBuffering = false;
  18.                 string sHTML = string.Empty;
  19.                 using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
  20.                 {
  21.                     using (Stream myResponseStream = response.GetResponseStream())
  22.                     {
  23.                         StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
  24.                         sHTML = myStreamReader.ReadToEnd();
  25.                     }
  26.                 }
  27.                 return sHTML;
  28.             }
  29.             catch (Exception ex)
  30.             {
  31.                 return null;
  32.             }
  33.         }
原生代码就上面几行,平均耗时还是184毫秒,越简单的代码越难优化,大家感觉上面的代码如何再优化才能达到平均耗时99毫秒?速度相差一倍!
0x06

优化的秘密“gzip”,如果,目标资源服务器支持gzip压缩的情况下,我们在访问网站的时候,浏览器请求网站的时候,请求头会带有下面的参数:

  1. accept-encoding:gzip, deflate, sdch, br

响应头参数:

  1. content-encoding:gzip

    通俗点讲:

    客户端说:我支持“gzip, deflate, sdch, br”压缩算法,你返回数据的时候,随便用那种都可以。

    服务端说:我正好支持gzip压缩算法,那我就用gzip算法,把数据压缩传给你

    客户端说:好的,那我把收到的数据用gzip算法解密

    gzip算法,可以对传输数据进行压缩,大大减少了传输的内容,所以,请求效率会提高,所以,优化后的代码如下:

    1. /// <summary>
    2.         /// 优化后的代码
    3.         /// </summary>
    4.         /// <param name=”url”></param>
    5.         /// <param name=”useragent”></param>
    6.         /// <returns></returns>
    7.         public static string GetHtml2(string url, string useragent)
    8.         {
    9.             try
    10.             {
    11.                 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    12.                 request.Method = “GET”;
    13.                 request.UserAgent = useragent;
    14.                 request.Timeout = 10000;
    15.                 request.Headers.Add(“Accept-Encoding”, “gzip”);
    16.                 request.AllowAutoRedirect = false;
    17.                 //对发送的数据不使用缓存
    18.                 request.AllowWriteStreamBuffering = false;
    19.                 string sHTML = string.Empty;
    20.                 using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    21.                 {
    22.                     using (GZipStream stream = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress))
    23.                     {
    24.                         using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
    25.                         {
    26.                             sHTML = reader.ReadToEnd();
    27.                         }
    28.                     }
    29.                 }
    30.                 return sHTML;
    31.             }
    32.             catch (Exception ex)
    33.             {
    34.                 return null;
    35.             }
    36.         }

    复制代码

    虽然是很小的细节,但是效率可谓提高了一倍!相当于,你两天采集的数据,现在1天可以采集完,此文,献给学习爬虫的朋友们。

    注意:gzip压缩算法和编程语言无关!

0
分享到:

 1. 本站实行充值兑换金币,1元=1金币,每日签到可领取1个金币,[我要充值]
 2. 标注免费的资源,登录后即可下载,加入我们VIP会员全站无限下载,[去开通]
 3. 本站正式上线, 推荐到QQ或者微信群免费获得VIP会员资格,详情[点我查看]
 4. 如果您找不到合适的资源,请联系我们,告知您的需求,我们会尽快整理发布。

没有账号? 忘记密码?
喜欢我嘛?喜欢就按“ctrl+D”收藏我吧!♡