|
0x00
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
0x01
一般爬虫简单来说的话,就是根据自己的规则去抓取数据,把抓取的数据加以分析,然后,获取到对自己有用的数据。
0x02
网络爬虫优化可以分两个阶段:
1:在抓取数据的时候进行优化;
2:对抓取结果的处理进行优化;
今天,我们只讲在抓取过程中的优化!
0x03
抓取过程中的优化,我自己总结过几点:
1:可以在物理地址上进行优化,例如:目标资源服务器是上海的腾讯云主机,我们尽可能的选择同地域的服务器,也就是上海地域的服务器,不要去选择北京、青岛等等地域的服务器,也尽量选择同idc机房的服务器,我们知道此资源网站是用的腾讯云的服务器,我们尽可能的把爬虫放在腾讯云服务器上面,而不要放在阿里云服务器上面!
2:选择稳定、快速的网络,一般爬虫对网络质量要求较高,尽量不要使用家庭网络,选择公司网络或则购买服务器进行抓取数据。
3:选择比较高效的爬虫语言,听说python在爬虫方面比较擅长,但是,我没有用过,以后再做测试,今天,我主要是以.net语言来讲解。
0x04
对于抢购之类的东西,对抓取速度要求较高,可谓是分秒必争,早获取到数据,就多增加抢到的几率,下面是我用控制台写了一个demo,对本网站数据进行抓取的测试,如下图:
(耗时越短,表示越快)
上面数据排名:1:原生优化后的代码、2:原生代码、3:第三方插件dll(包)
0x05
为什么第三方插件(包)耗时最长?第三方插件其实是对原生代码的大量封装,大量逻辑判断,通用性比较强,可能会导致抓取速度很慢。
下面是原生代码:
- /// <summary>
- /// 原生代码
- /// </summary>
- /// <param name="url"></param>
- /// <param name="useragent"></param>
- /// <returns></returns>
- public static string GetHtml(string url, string useragent)
- {
- try
- {
- HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
- request.Method = "GET";
- request.UserAgent = useragent;
- request.Timeout = 10000;
- request.AllowAutoRedirect = false;
- //对发送的数据不使用缓存
- request.AllowWriteStreamBuffering = false;
- string sHTML = string.Empty;
- using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
- {
- using (Stream myResponseStream = response.GetResponseStream())
- {
- StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
- sHTML = myStreamReader.ReadToEnd();
- }
- }
- return sHTML;
- }
- catch (Exception ex)
- {
- return null;
- }
- }
复制代码
原生代码就上面几行,平均耗时还是184毫秒,越简单的代码越难优化,大家感觉上面的代码如何再优化才能达到平均耗时99毫秒?速度相差一倍!
0x06
优化的秘密“gzip”,如果,目标资源服务器支持gzip压缩的情况下,我们在访问网站的时候,浏览器请求网站的时候,请求头会带有下面的参数:
- accept-encoding:gzip, deflate, sdch, br
复制代码 响应头参数:
关于“Accept-Encoding”的介绍:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding
通俗点讲:
客户端说:我支持“gzip, deflate, sdch, br”压缩算法,你返回数据的时候,随便用那种都可以。
服务端说:我正好支持gzip压缩算法,那我就用gzip算法,把数据压缩传给你
客户端说:好的,那我把收到的数据用gzip算法解密
gzip算法,可以对传输数据进行压缩,大大减少了传输的内容,所以,请求效率会提高,所以,优化后的代码如下:
- /// <summary>
- /// 优化后的代码
- /// </summary>
- /// <param name="url"></param>
- /// <param name="useragent"></param>
- /// <returns></returns>
- public static string GetHtml2(string url, string useragent)
- {
- try
- {
- HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
- request.Method = "GET";
- request.UserAgent = useragent;
- request.Timeout = 10000;
- request.Headers.Add("Accept-Encoding", "gzip");
- request.AllowAutoRedirect = false;
- //对发送的数据不使用缓存
- request.AllowWriteStreamBuffering = false;
- string sHTML = string.Empty;
- using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
- {
- using (GZipStream stream = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress))
- {
- using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
- {
- sHTML = reader.ReadToEnd();
- }
- }
- }
- return sHTML;
- }
- catch (Exception ex)
- {
- return null;
- }
- }
复制代码
虽然是很小的细节,但是效率可谓提高了一倍!相当于,你两天采集的数据,现在1天可以采集完,此文,献给学习爬虫的朋友们。
注意:gzip压缩算法和编程语言无关!
最后,附上源码:
|
评分
-
查看全部评分
上一篇:国际惯例新人报道来一发下一篇:.net/c# 次世代验证码识别系统2.3教程
|