架构师_程序员

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5015|回复: 21
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-4-19 14:21:02 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
0x00

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

0x01

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

0x02

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

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

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

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

0x03

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

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

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

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

0x04

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


(耗时越短,表示越快)

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





关于“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教程
帖子永久地址: 

架构师_程序员 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与架构师_程序员享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和架构师_程序员的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、架构师_程序员管理员和版主有权不事先通知发贴者而删除本文

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
推荐
发表于 6 天前 | 只看该作者
小白来学习,感谢楼主分享。
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
推荐
发表于 2018-10-8 16:13:57 | 只看该作者
111111111111111111111
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
推荐
发表于 2018-11-8 10:10:49 | 只看该作者
网络爬虫优化之路 收藏
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
5#
发表于 2018-4-20 12:35:21 | 只看该作者
谢谢分享哦
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
6#
发表于 2018-4-25 11:33:55 | 只看该作者
收藏,或许有用。
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
7#
发表于 2018-5-17 18:02:21 | 只看该作者
网络爬虫优化之路 收藏
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
8#
发表于 2018-5-18 16:10:57 | 只看该作者
ooooooooooooooooooo
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
9#
发表于 2018-7-18 14:43:07 | 只看该作者
看看有没有用
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
10#
发表于 2018-7-20 10:09:50 | 只看该作者
DADASDSADSAD
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
11#
发表于 2018-8-13 13:06:50 | 只看该作者
查看下这个源码
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
12#
发表于 2018-8-20 14:00:52 | 只看该作者

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

使用道具 举报

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

本版积分规则

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

Mail To:help@itsvse.com

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

GMT+8, 2018-12-11 05:32

Powered by Discuz! X3.4

© 2001-2014 Comsenz Inc.

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