日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
從測(cè)試300萬個(gè)超鏈接接學(xué)到的

Stack Exchange上有超過三百萬個(gè)不同的鏈接。經(jīng)過很長時(shí)間,許多鏈接已經(jīng)不能用了。

創(chuàng)新互聯(lián)公司專注于天柱網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供天柱營銷型網(wǎng)站建設(shè),天柱網(wǎng)站制作、天柱網(wǎng)頁設(shè)計(jì)、天柱網(wǎng)站官網(wǎng)定制、重慶小程序開發(fā)服務(wù),打造天柱網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供天柱網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

最近我花時(shí)間編寫了一個(gè)工具,它能判斷哪些是壞鏈,能幫助我們來修復(fù)壞鏈。

我們是怎么做的?

首先,我們要對(duì)他人的網(wǎng)站心存敬意。

做一個(gè)好的網(wǎng)民

● 對(duì)每個(gè)域名限制請(qǐng)求

我們采用自動(dòng)過期的set,來確保十秒鐘內(nèi)對(duì)單個(gè)域名不會(huì)請(qǐng)求多過一次。當(dāng)我們覺得需要對(duì)某些鏈接進(jìn)行更多的測(cè)試時(shí),我們也做了特殊處理。

 
 
 
 
  1. public class AutoExpireSet
  2. {
  3.  
  4.     Dictionary items = new Dictionary();
  5.     Dictionary expireOverride =
  6.          new Dictionary();
  7.  
  8.     int defaultDurationSeconds;
  9.  
  10.     public AutoExpireSet(int defaultDurationSeconds)
  11.     {
  12.         this.defaultDurationSeconds =
  13.            defaultDurationSeconds;
  14.     }
  15.  
  16.     public bool TryReserve(T t)
  17.     {
  18.         bool reserved = false;
  19.         lock (this)
  20.         {
  21.             DateTime dt;
  22.             if (!items.TryGetValue(t, out dt))
  23.             {
  24.                 dt = DateTime.MinValue;
  25.             }
  26.  
  27.             if (dt < DateTime.UtcNow)
  28.             {
  29.                 TimeSpan span;
  30.                 if (!expireOverride.TryGetValue(t, out span))
  31.                 {
  32.                     span =
  33.                      TimeSpan.FromSeconds(defaultDurationSeconds);
  34.                 }
  35.                 items[t] = DateTime.UtcNow.Add(span);
  36.                 reserved = true;
  37.             }
  38.  
  39.         }
  40.         return reserved;
  41.     }
  42.  
  43.     public void ExpireOverride(T t, TimeSpan span)
  44.     {
  45.         lock (this)
  46.         {
  47.             expireOverride[t] = span;
  48.         }
  49.     }
  50. }

● 健壯的驗(yàn)證函數(shù)

我們的驗(yàn)證函數(shù)包括了許多我認(rèn)為非常重要的概念。

 
 
 
 
  1. public ValidateResult Validate(
  2.       bool useHeadMethod = true,
  3.       bool enableKeepAlive = false,
  4.       int timeoutSeconds = 30 )
  5. {
  6.     ValidateResult result = new ValidateResult();
  7.  
  8.     HttpWebRequest request = WebRequest.Create(Uri)
  9.                                   as HttpWebRequest;
  10.     if (useHeadMethod)
  11.     {
  12.         request.Method = "HEAD";
  13.     }
  14.     else
  15.     {
  16.         request.Method = "GET";
  17.     }
  18.  
  19.     // always compress, if you get back a 404 from a HEAD
  20.     //     it can be quite big.
  21.     request.AutomaticDecompression = DecompressionMethods.GZip;
  22.     request.AllowAutoRedirect = false;
  23.     request.UserAgent = UserAgentString;
  24.     request.Timeout = timeoutSeconds * 1000;
  25.     request.KeepAlive = enableKeepAlive;
  26.  
  27.     HttpWebResponse response = null;
  28.     try
  29.     {
  30.         response = request.GetResponse() as HttpWebResponse;
  31.  
  32.         result.StatusCode = response.StatusCode;
  33.         if (response.StatusCode ==
  34.                    HttpStatusCode.Redirect ||
  35.             response.StatusCode ==
  36.                    HttpStatusCode.MovedPermanently ||
  37.             response.StatusCode ==
  38.                    HttpStatusCode.SeeOther ||
  39.             response.StatusCode ==
  40.                    HttpStatusCode.TemporaryRedirect)
  41.         {
  42.             try
  43.             {
  44.                 Uri targetUri =
  45.                   new Uri(Uri, response.Headers["Location"]);
  46.                 var scheme = targetUri.Scheme.ToLower();
  47.                 if (scheme == "http" || scheme == "https")
  48.                 {
  49.                     result.RedirectResult =
  50.                         new ExternalUrl(targetUri);
  51.                 }
  52.                 else
  53.                 {
  54.                     // this little gem was born out of
  55.                     //   http://tinyurl.com/18r
  56.                     //   redirecting to about:blank
  57.                     result.StatusCode =
  58.                            HttpStatusCode.SwitchingProtocols;
  59.                     result.WebExceptionStatus = null;
  60.                 }
  61.             }
  62.             catch (UriFormatException)
  63.             {
  64.                 // another gem ... people sometimes redirect to
  65.                 //    http://nonsense:port/yay
  66.                 result.StatusCode =
  67.                     HttpStatusCode.SwitchingProtocols;
  68.                 result.WebExceptionStatus =
  69.                     WebExceptionStatus.NameResolutionFailure;
  70.             }
  71.  
  72.         }

● 從***天開始就設(shè)置正確的User Agent字符串

如果什么地方出錯(cuò)了,你希望他人能夠聯(lián)系到你。我們的鏈接爬蟲的user agent字符串為: Mozilla/5.0 (compatible; stackexchangebot/1.0; +http://meta.stackoverflow.com/q/130398)。

● 處理302, 303, 307等頁面跳轉(zhuǎn)

盡管302和303跳轉(zhuǎn)非常常見,307卻不多見。它被作為一種針對(duì)瀏覽器的錯(cuò)誤表現(xiàn)的解決方法被引入,解釋見此處。

307***的例子是http://www.haskell.org。我非常不贊同在首頁就跳轉(zhuǎn)地做法,URL重寫以及其他的工具可以解決這個(gè)問題,而不需要有多余的跳轉(zhuǎn);但是,首頁跳轉(zhuǎn)仍舊存在。

當(dāng)你跳轉(zhuǎn)時(shí),你需要繼續(xù)測(cè)試。我們的鏈接測(cè)試機(jī)會(huì)測(cè)試最多五層。你需要設(shè)置層次上限,否則你會(huì)陷入無限循環(huán)。

跳轉(zhuǎn)有時(shí)很奇怪,網(wǎng)站有時(shí)會(huì)把你導(dǎo)向到about:config或一個(gè)不存在的URL。檢驗(yàn)跳轉(zhuǎn)的頁面信息很重要。

● 當(dāng)你獲得所需要的信息時(shí),請(qǐng)及時(shí)中斷請(qǐng)求

在TCP協(xié)議中,包收到時(shí),特殊的狀態(tài)會(huì)被標(biāo)記。當(dāng)客戶端發(fā)送給服務(wù)器的包中標(biāo)記了FIN的話,連接會(huì)早早的中止。調(diào)用request.Abort你可以避免在404時(shí)從服務(wù)器端下載大量數(shù)據(jù)。

當(dāng)測(cè)試鏈接時(shí),你經(jīng)常需要避免HTTP keepalive。因?yàn)槲覀兊臏y(cè)試機(jī)沒必要給服務(wù)器造成不必要得連接負(fù)擔(dān)。

中斷可以減少壓縮,但我非常贊成啟用壓縮。

● 先使用HEAD請(qǐng)求,再用GET請(qǐng)求

一些服務(wù)器不使用HEAD。例如,Amazon完全禁止了,對(duì)HEAD請(qǐng)求返回405。在ASP.NET MVC中,人們經(jīng)常顯式設(shè)置路由經(jīng)過的verb屬性。程序員們?cè)谝?guī)定使用HttpVerbs.Get時(shí)往往沒有使用HttpVerbs.Head。所以當(dāng)你失敗時(shí)(沒有獲得200響應(yīng)),你需要重新使用GET verb來測(cè)試。(譯者:這一段不是很懂,如有錯(cuò)誤請(qǐng)指正。)

● 忽略robots.txt

開始我打算做一個(gè)好網(wǎng)民,解析了所有的robots.txt文件,遵守排除和爬蟲頻率。但事實(shí)上許多網(wǎng)站如GitHub, Delicious和Facebook都有針對(duì)爬蟲的白名單。所有的爬蟲都被屏蔽了,除了那些著名的允許爬蟲的網(wǎng)站(如Google, Yahoo和Bing)。因?yàn)殒溄訙y(cè)試機(jī)是不會(huì)抓取網(wǎng)頁,關(guān)注robots.txt也不現(xiàn)實(shí),所以我建議忽略robots.txt。這在Meta Stack Overflow也有討論。

● 使用合理的超時(shí)

測(cè)試時(shí),我們給網(wǎng)站30s來響應(yīng),但有些網(wǎng)站需要更長時(shí)間。你當(dāng)然不想讓一個(gè)惡意的網(wǎng)站讓你的測(cè)試機(jī)停止。所以我們采用30s作為最長的響應(yīng)時(shí)間。

● 用很多線程來測(cè)試鏈接

我用在悉尼的開發(fā)電腦來做鏈接測(cè)試,顯然串行的三百萬次訪問不知道會(huì)占用多長時(shí)間。所以我用了30個(gè)線程。

并發(fā)當(dāng)然也會(huì)帶來一些技術(shù)挑戰(zhàn)。你也不想在等待一個(gè)域名釋放資源的時(shí)候讓一個(gè)線程阻塞。

我采用Async類來管理隊(duì)列。相對(duì)于微軟的任務(wù)并行庫(Microsoft Task Parallel Library),我更喜歡Async,因?yàn)槭褂盟鼇硐拗凭€程池中的線程數(shù)量非常簡單,而且API也簡單易用。

● 一次實(shí)效不代表***失效

我仍舊在調(diào)整判斷一個(gè)鏈接是壞鏈的算法。一次失效有可能是偶然事件。一個(gè)星期內(nèi)的數(shù)次失效可能是服務(wù)器壞掉或者不幸的巧合。

現(xiàn)在隔天的兩次失效看起來比較可靠 – 我們沒有去尋找最***的算法,而是讓用戶告訴我們什么時(shí)候出錯(cuò)了,但我們相信出錯(cuò)率不高。

同樣的我們?nèi)耘f需要確定在一次成功測(cè)試之后多久藥重新測(cè)試。我想每隔三個(gè)月測(cè)一次就足夠了。

測(cè)試鏈接的一些有趣發(fā)現(xiàn)

Kernel.org被黑了

2011年9月1日,Kernel.org被黑了。你要問,這和測(cè)試鏈接有什么關(guān)系呢?

事實(shí)證明有人破壞了所有的文檔鏈接,這些鏈接今天仍舊不能用。例如http://www.kernel.org/pub/software/scm /git/docs/git-svn.html 在Stack Overflow的150個(gè)左右的帖子里出現(xiàn)過,現(xiàn)在它們會(huì)將你導(dǎo)向到404頁面,而它的新地址應(yīng)該在:http://git-scm.com/docs /git-svn。在所有我碰到的壞鏈中,git文檔的壞鏈?zhǔn)亲顕?yán)重的。將近影響了6000個(gè)帖子。采用Apache的重寫功能來處理它是非常容易的。

有的網(wǎng)站的URL不能給你任何信息

http://www.microsoft.com/downloads/details.aspx?familyid=e59c3964-672d-4511-bb3e-2d5e1db91038displaylang=en 是個(gè)壞鏈,在60個(gè)左右的帖子中出現(xiàn)。想象下,如果這個(gè)鏈接類似于http://www.microsoft.com/downloads/ie- developer-toolbar-beta-3,那么就算微軟打算移走這個(gè)鏈接,我們?nèi)耘f克一猜測(cè)它可能帶我們?nèi)サ绞裁错撁妗?/p>

將你的404頁面做的別致和有用–從GitHub學(xué)到的

在所有的404頁面中,GitHub的讓我最生氣。

你問為什么?

它看起來很酷,有相當(dāng)不錯(cuò)的視覺效果。有些人就是看什么都不順眼。

嗯,事實(shí)上是:

https://github.com/dbalatero/typhoeus 在50個(gè)左右的帖子里被引用,而它已經(jīng)轉(zhuǎn)移到https://github.com/typhoeus。GitHub沒有使用任何的跳轉(zhuǎn),僅僅將你轉(zhuǎn)到404頁面。

對(duì)url采用最基本的解析以確定真正想要去的頁面是非常小的開銷:

對(duì)不起,我們沒有找到你鏈接到的頁面。用戶經(jīng)常會(huì)改變賬戶導(dǎo)致鏈接失效?!眛yphoeus”庫也存在于:https://github.com/typhoeus

是的,沒有任何信息告訴我我犯了個(gè)錯(cuò)誤。GitHub應(yīng)該讓404頁面變得更有用。對(duì)我來說GitHub 404頁面最讓我氣憤地是我花了很多力氣而找不到結(jié)果。不要給我漂亮的頁面,能提供一些有用的信息嗎。

你可以做多一步,跳轉(zhuǎn)到他們新的首頁去,我理解賬號(hào)是非常有技巧的,但它看起來在GitHub上是多么不可思議的常見錯(cuò)誤啊。

在Stack Overflow上我們花了很多時(shí)間來優(yōu)化這種情況,例如“你最喜歡的程序員笑話是什么?”,討論區(qū)認(rèn)為這個(gè)問題不會(huì)持續(xù)很久,所以我們盡可能解釋為什么要移除它,以及哪里可以找到它。

Oracle的問題

Oracle收購Sun對(duì)Java生態(tài)圈來說是個(gè)永遠(yuǎn)的沉重的打擊。Oracle的任務(wù)是重新樹立品牌,重構(gòu)Java 生態(tài)圈,但這是錯(cuò)誤的引導(dǎo)。大量的文檔都沒有被正確定向。就連最近的在dev.java.net下的所有項(xiàng)目都沒有正確的跳轉(zhuǎn)頁面。Hudson這個(gè) Java持續(xù)集成的服務(wù)器曾經(jīng)使用https://hudson.dev.java.net/ (譯者注:也失效了),Stack Overflow中150個(gè)帖子都引用了它。

個(gè)人的教訓(xùn)

href 標(biāo)題的重要性

在短鏈的世界里,看起來在URI里使用任何合理的標(biāo)題不再那么被鼓勵(lì)了。事實(shí)上過去的三年里你訪問的5%的鏈接都失效了。我相信我的博客中也有許多壞鏈。修復(fù)壞鏈?zhǔn)莻€(gè)困難的任務(wù),尤其在沒有上下文的情況下,這項(xiàng)任務(wù)變得更加困難。

所以我決定為我的鏈接都加上合理的標(biāo)題。不僅因?yàn)槟茏屗阉饕娓玫厮阉鹘Y(jié)果,也能讓用戶知道受損的圖片下是什么內(nèi)容,同時(shí)在處理壞的勢(shì)后能幫我修復(fù)它。

超鏈接是很脆弱的

當(dāng)我們使用Google時(shí),我們從來沒得到404。它確保我們?cè)陔s亂無章的網(wǎng)絡(luò)中高效的搜索。測(cè)試很多的鏈接告訴你現(xiàn)實(shí)并沒有那么的好。那么意味著我要避免使用鏈接嗎?當(dāng)然不是,知道問題的存在能夠幫我思考我寫下的內(nèi)容。我會(huì)避免寫出失去意義的文章。在Stack Overflow我們經(jīng)??吹饺缦碌幕貜?fù):

See this blog post over here. 看看這里的文章。

當(dāng)外部資源鏈接失效的時(shí)候,這種答案就沒有了意義。


網(wǎng)頁標(biāo)題:從測(cè)試300萬個(gè)超鏈接接學(xué)到的
分享地址:http://m.5511xx.com/article/copdhig.html