|
吾爱游客
发表于 2019-10-22 11:19
1、申 请 I D:championzhang
2、个人邮箱:565968679@qq.com
3、原创技术文章:.net/c#网路爬虫优化
本人是一个大二计算机专业的菜鸟,最近学习了用c#爬虫,觉得有很多代码优化的并不是很好,所以就总结几点分享一下,希望可以给予通过
1.网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
2.网络爬虫优化可以分两个阶段:1:在抓取数据的时候进行优化;
2:对抓取结果的处理进行优化;
今天,我只讲在抓取过程中的优化
抓取过程中的优化,我自己总结过几点:
1:可以在物理地址上进行优化,例如:目标资源服务器是上海的腾讯云主机,我们尽可能的选择同地域的服务器,也就是上海地域的服务器,不要去选择北京、青岛等等地域的服务器,也尽量选择同idc机房的服务器,我们知道此资源网站是用的腾讯云的服务器,我们尽可能的把爬虫放在腾讯云服务器上面,而不要放在阿里云服务器上面!
2:选择稳定、快速的网络,一般爬虫对网络质量要求较高,尽量不要使用家庭网络,选择公司网络或则购买服务器进行抓取数据。
3:选择比较高效的爬虫语言,听说python在爬虫方面比较擅长,但是,我没有用过,以后再做测试,今天,我主要是以.net语言来讲解。
3.为什么第三方插件(包)耗时最长?第三方插件其实是对原生代码的大量封装,大量逻辑判断,通用性比较强,可能会导致抓取速度很慢。下面是原生代码:
/// <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毫秒?速度相差一倍!
优化的秘密“gzip”,如果,目标资源服务器支持gzip压缩的情况下,我们在访问网站的时候,浏览器请求网站的时候,请求头会带有下面的参数:
如下图:
截图
通俗点讲:
客户端说:我支持“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压缩算法和编程语言无关! |
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|