架構師_程序員

 找回密碼
 注冊[Register]

QQ登錄

只需一步,快速開始

查看: 15207|回復: 47

[控制臺程序] .net/c# 網絡爬蟲優化之路

[復制鏈接]
跳轉到指定樓層
樓主
發表于 2018-4-19 14:21:02
zu
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壓縮算法和編程語言無關!

最后,附上源碼:

游客,如果您要查看本帖隱藏內容請回復

評分

參與人數 1MB +1 貢獻 +1 收起 理由
愛學習的小小白 + 1 + 1 支持樓主發好帖,我也會發好帖!.

查看全部評分





上一篇:國際慣例新人報道來一發
下一篇:.net/c# 次世代驗證碼識別系統2.3教程
帖子永久地址: 

架構師_程序員 - 論壇版權1、本主題所有言論和圖片純屬會員個人意見,與本論壇立場無關
2、本站所有主題由該帖子作者發表,該帖子作者與架構師_程序員享有帖子相關版權
3、其他單位或個人使用、轉載或引用本文時必須同時征得該帖子作者和架構師_程序員的同意
4、帖子作者須承擔一切因本文發表而直接或間接導致的民事或刑事法律責任
5、本帖部分內容轉載自其它媒體,但并不代表本站贊同其觀點和對其真實性負責
6、如本帖侵犯到任何版權問題,請立即告知本站,本站將及時予與刪除并致以最深的歉意
7、架構師_程序員管理員和版主有權不事先通知發貼者而刪除本文

碼農網,只發表在實踐過程中,遇到的技術難題,不誤導他人。
推薦
發表于 2019-6-10 14:11:09
小白傷不起。有沒類似大數據一鍵采集的軟件。?
碼農網,只發表在實踐過程中,遇到的技術難題,不誤導他人。
推薦
發表于 2019-10-15 10:29:57
GANJUETINGHAOWANDE  KANN
碼農網,只發表在實踐過程中,遇到的技術難題,不誤導他人。
推薦
發表于 2019-6-26 17:07:51
支持樓主發好帖,我也會發好帖!
碼農網,只發表在實踐過程中,遇到的技術難題,不誤導他人。
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, 2019-11-25 00:19

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表
时时彩开奖时间提至20分钟