架构师_程序员

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3804|回复: 11

[控制台程序] .net/c# 网络爬虫优化之路

[复制链接]
发表于 2018-4-19 14:21:02 | 显示全部楼层 |阅读模式
0x00

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

0x01

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

0x02

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

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

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

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

0x03

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

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

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

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

0x04

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

QQ截图20180419133334.jpg
(耗时越短,表示越快)

上面数据排名: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
复制代码



QQ截图20180419140631.jpg

关于“Accept-Encoding”的介绍:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding

通俗点讲:

客户端说:我支持“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压缩算法和编程语言无关!

最后,附上源码:

游客,如果您要查看本帖隐藏内容请回复





上一篇:VS2015 +EF6 连接MYSQL数据库生成实体
下一篇:.net/c# 次世代验证码识别系统2.3教程
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2018-10-8 16:13:57 | 显示全部楼层
111111111111111111111
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2018-5-17 18:02:21 | 显示全部楼层
网络爬虫优化之路 收藏
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2018-5-18 16:10:57 | 显示全部楼层
ooooooooooooooooooo
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2018-4-20 12:35:21 | 显示全部楼层
谢谢分享哦
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2018-4-25 11:33:55 | 显示全部楼层
收藏,或许有用。
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2018-7-18 14:43:07 | 显示全部楼层
看看有没有用
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2018-7-20 10:09:50 | 显示全部楼层
DADASDSADSAD
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2018-8-13 13:06:50 | 显示全部楼层
查看下这个源码
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2018-8-20 14:00:52 | 显示全部楼层

谢谢分享
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
回复

使用道具 举报

发表于 2018-8-30 11:42:26 | 显示全部楼层
srkskrskrskrskrskr
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

关闭

站点通知上一条 /1 下一条

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。

Mail To:help@itsvse.com

QQ|Archiver|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2018-10-19 00:16

Powered by Discuz! X3.4

© 2001-2014 Comsenz Inc.

快速回复 返回顶部 返回列表