當前位置:首頁 » 網站資訊 » 如何爬網站的所有路徑
擴展閱讀
無線網路建設挑戰 2025-09-30 06:02:42
路由器橋接主人網路 2025-09-30 05:59:43

如何爬網站的所有路徑

發布時間: 2023-02-09 18:36:33

如何尋找網站後台(小白必看)

【查找網站後台的方法】

1.猜解常用路徑

常用後台路徑:

Admin

Adminlogin

Admin/admin_login.asp

Admin/admin_login.php

Manage

User

System

大部分網站默認都是admin目錄後台。

2.Robots.txt

Robots是防止搜索引擎抓取敏感目錄和文件的的一個指引文件。

Admin/

很多管理員為了防止後台被搜索引擎抓取,所有會把後台路徑放進robots.txt里

類似robots.txt sitemap.xml

3.掃描工具

如果字典內有目標的後台路徑,那麼就可以掃出來(可能會有復雜的情況,禁止掃描等 不過很少)

4.爬行(Awvs  burp suite 整站爬行工具)

掃描:暴力猜解  利用字典

爬行:

訪問網站首頁:

A界面存在很多鏈接

    抓取A界面的所有鏈接,分別變成B C D 等等

            繼續抓取B C D界面,一直循環。直到爬行完。

5.查看圖片屬性

什麼會爆出後台路徑?

當我們上傳點在後台目錄後面,很有可能導致這種情況。

一般編輯器放在後台目錄後面,基本上都可以用這種方法找到後台。

6.谷歌語法 site:目標站 intitle:後台 管理 登錄 管理員 管理中心  inurl:admin|login|user

site:zlgc.usx.e.cn

7.網站位置暴露管理入口

背景:

尤其是多個管理員的網站,一般學校和行政單位居多。為了方便登錄後台,會在前台留一個入口。

⑵ 知道圖片的路徑,怎麼做爬蟲爬取網站的所有

圖片路徑沒必要讓爬蟲抓,除非你就是個素材型網站,那ALT一定要去設置,讓爬蟲抓取,到站長平台主動推送或者做sitemap地圖給平台就O了

⑶ 如何查看百度蜘蛛路徑

通過分析IIS日誌查看網路蜘蛛路徑
一、IIS日誌的重要作用
1.通過IIS日誌可以了解蜘蛛對網站的基本爬取情況,可以知道蜘蛛的爬取軌跡和爬取量,通過我們的IIS日誌,外鏈的多和少和網站蜘蛛的爬取量是有直接影響的,我們所說的鏈接誘餌就是如果你做了一個外鏈,蜘蛛在爬取這個外鏈頁面並把頁面放出來時,蜘蛛可以通過你留的這個鏈接來爬取你的網站,而IIS 日誌正是會記錄下蜘蛛的這次爬取行動。
2.網站的更新頻率也和IIS日誌中蜘蛛抓取的頻率有關,一般來說更新頻率越高,蜘蛛的抓取頻率越高,而我們網站的更新不僅僅只是新內容的添加同時還有我們的微調操作。
3.我們可以根據IIS日誌的反應情況,對我們的空間的某些事情和問題提前進行預警,因為伺服器如果出問題的話在IIS日誌中會第一時間反映出來,要知道伺服器的穩定速度和打開速度兩者都會直接影響我們的網站。
4.通過IIS日誌我們可以知道網站的那些頁面是很受蜘蛛歡迎的,而哪些頁面是蜘蛛連碰都不去碰的,同時我們還能發現有一些蜘蛛由於是過度爬取對我們的伺服器資源損耗是很大的,我們要進行屏蔽工作。
二、如何下載日誌及日誌設置注意事項
1.首先我們的空間要支持IIS日誌下載,這一點是很重要的,在我們購買空間之前必須要先問好支不支持IIS日誌下載,因為有的服務商是不提供這項服務的,如果支持的話空間後台一般都有日誌WebLog日誌下載這個功能把它下載到根目錄在用FTP傳到本地就可以,伺服器的話可以設置將日誌文件下載到指定路徑。
2.這里有個很重要的問題,IIS日誌強烈建議設置成每小時生成一次,小型的企業站和頁面內容較少的網站可以設置成一天,它默認是一天,如果內容多或者大型站設置成一天生成一次,那麼一天只生成一個文件,這個文件會相當的大,我們有時電腦打開是會造成死機,設置的話找空間商協調設置即可。
三、IIS日誌的分析
1.日誌的後綴名是log的我們用記事本打開,選擇格式里的自動換行這樣看起來方便,同時用搜索功能搜索BaiSpider和Googlebot這兩個蜘蛛。
例如:
網路蜘蛛
2012-03-1300:47:10W3SVC177116.255.169.37GET/-80-220.181.51.144Baispider-favo+(+/search/spider)2000015256197265?
谷歌機器人
2012-03-1308:18:48W3SVC177116.255.169.37GET/robots.txt-80-222.186.24.26Googlebot/2.1+(+google/bot)2000098520031?
我們分段來解釋
2012-03-1300:47:10蜘蛛爬取的日期和時間點
W3SVC177這個是機器碼這個是惟一的我們不去管它
116.255.169.37這個IP地址是伺服器的IP地址
GET代表事件
GET後面就是蜘蛛爬取的網站頁面,斜杠就代表首頁
80是埠的意思
220.181.51.144這個IP則是蜘蛛的IP,這里告訴大家一個鑒別真假網路蜘蛛的方法,我們電腦點擊開始運行輸入cmd打開命令提示符,輸入nslookup空格加蜘蛛IP點擊回車,一般真網路蜘蛛都有自己的伺服器IP而假蜘蛛則沒有。
如果網站中出現了大量的假蜘蛛則說明有人冒充網路蜘蛛來採集你的內容,你就需要注意了,如果太猖獗那會很佔用你的伺服器資源,我們需要屏蔽他們的IP.
20000這里是狀態碼狀態碼的意思可以在網路里搜索下
197265最後兩個數字則代表著訪問和下載的數據位元組數。
2.我們分析的時候先看看狀態碼200代表下載成功,304代表頁面未修改,500代表伺服器超時,這些是一般的其他代碼可以網路一下,對於不同的問題我們要處理。
3.我們要看蜘蛛經常爬取哪些頁面,我們要記錄下來,分析他們為什麼會經常被蜘蛛爬取,從而分析出蜘蛛所喜歡內容。?
4.有時候我們的路徑不統一出現帶斜杠和不帶斜杠的問題,蜘蛛會自動識別為301跳轉到帶斜杠的頁面,這里我們就發現了搜索引擎是可以判斷我們的目錄的,所以我們要對我們的目錄進行統一。
5.我們分析日誌分析時間長了,我們能夠看出蜘蛛的抓取規律,同一目錄下面的單個文件的抓取頻率間隔和不同目錄的抓取頻率間隔都可以看出來,這些抓取頻率間隔時間是蜘蛛根據網站權重和網站更新頻率來自動確定的。
6.蜘蛛對於我們的頁面的抓取是分等級的,是根據權重依次遞減的,一般順序為首頁、目錄頁、內頁。
7.不同IP的蜘蛛他們的抓取頻率也是不相同的。

⑷ scrapy爬取整個網頁時如何避免鏈接失效

最近在使用scrapy爬取網頁時遇到很多圖片不能正常顯示、a標簽鏈接失效的情況,多是因為爬下來的網頁和圖片路徑已經失去了原有的結構,網頁無法根據標簽的src或者標簽的href找到對應的資源,下面就這個問題展開一個小研究。

首先,做這個工作是一定要修改網頁的,所以我們引入BeautifulSoup庫對網頁進行解析。

其次,在本文中 所有的網頁以域名為目錄名進行保存

下面我們 分情況討論

大體上看,網頁中的鏈接有以下幾種格式:

第一種情況,鏈接直接以/開頭,很明顯是從網站的根目錄開始檢索,那麼我們直接將該網站的存儲路徑加在page前即可(home_path代表當前網頁在我們系統中保存的路徑,包含域名):

第二種情況,鏈接直接以http開頭,結尾可能有'/'也可能沒有,此時我們直接將其索引至域名目錄下的index.html或index.jsp,具體看你要爬的網頁的特徵,此處只做示例, dir_website為我們保存爬取的網頁的路徑,不包含域名

第三種情況,鏈接仍以http開頭,結尾是資源的具體路徑,這時候我們不僅要提取域名,還要提取出資源的位置。

注意,這個域名一定要從鏈接中提取,而不是直接插入當前爬取的網站域名,這是因為 href里的鏈接不一定來源於當前網站 ,有可能索引到其他的網站,這時候如果我們同時爬取了它索引到的網站,通過這種方法我們仍然能夠正常訪問。

第四種情況——'#content',href里的鏈接以'#'開頭,代表你點擊這個鏈接後在當前頁面內查找id='content'的元素,並切換到該元素所在的位置。這種鏈接我們並不需要處理,直接continue即可。

第五種和第六種情況我們可以一起處理,這得益於python中path模塊的一個方法:

這個方法是什麼意思呢,它可以把傳入的url的格式調整為正確的格式,比如:

有了這個方法,我們可以直接轉換第五種和第六種情況的鏈接。

至於第七種情況,很明顯這種鏈接是通過向後端的Servlet發送請求來獲取頁面,而我們爬下來的網頁是沒有後端的,但是我們確實能夠通過scrapy爬到這個網頁,那我們就把爬下來的網頁加上.html的後綴,然後給這個鏈接也加上後綴,我們就可以通過點擊鏈接來訪問目標資源了。

當然,在那之前,我們得去掉網頁鏈接里的'/',因為我們保存的網頁文件名字里是不可能包含'/'的。

至此,我們已經解決了大多數爬下來的網頁資源不可達的問題了,以上是對於<a>標簽做的處理,<img>標簽同理,就不再贅述。

還有一種比較少見的情況,就是網頁內的資源url是經過編碼的,比如'%'會變成'%25',此時我們只要將保存文件的名稱進行解碼後再保存即可,相關函數是urllib.unquote()。而網頁內的鏈接無須解碼,因為它們在訪問資源時會自動解碼。

⑸ 精通Python網路爬蟲之網路爬蟲學習路線

欲精通Python網路爬蟲,必先了解網路爬蟲學習路線,本篇經驗主要解決這個問題。部分內容參考自書籍《精通Python網路爬蟲》。

作者:韋瑋

轉載請註明出處

隨著大數據時代的到來,人們對數據資源的需求越來越多,而爬蟲是一種很好的自動採集數據的手段。

那麼,如何才能精通Python網路爬蟲呢?學習Python網路爬蟲的路線應該如何進行呢?在此為大傢具體進行介紹。

1、選擇一款合適的編程語言

事實上,Python、PHP、JAVA等常見的語言都可以用於編寫網路爬蟲,你首先需要選擇一款合適的編程語言,這些編程語言各有優勢,可以根據習慣進行選擇。在此筆者推薦使用Python進行爬蟲項目的編寫,其優點是:簡潔、掌握難度低。

2、掌握Python的一些基礎爬蟲模塊

當然,在進行這一步之前,你應當先掌握Python的一些簡單語法基礎,然後才可以使用Python語言進行爬蟲項目的開發。

在掌握了Python的語法基礎之後,你需要重點掌握一個Python的關於爬蟲開發的基礎模塊。這些模塊有很多可以供你選擇,比如urllib、requests等等,只需要精通一個基礎模塊即可,不必要都精通,因為都是大同小異的,在此推薦的是掌握urllib,當然你可以根據你的習慣進行選擇。

3、深入掌握一款合適的表達式

學會了如何爬取網頁內容之後,你還需要學會進行信息的提取。事實上,信息的提取你可以通過表達式進行實現,同樣,有很多表達式可以供你選擇使用,常見的有正則表達式、XPath表達式、BeautifulSoup等,這些表達式你沒有必要都精通,同樣,精通1-2個,其他的掌握即可,在此建議精通掌握正則表達式以及XPath表達式,其他的了解掌握即可。正則表達式可以處理的數據的范圍比較大,簡言之,就是能力比較強,XPath只能處理XML格式的數據,有些形式的數據不能處理,但XPath處理數據會比較快。

4、深入掌握抓包分析技術

事實上,很多網站都會做一些反爬措施,即不想讓你爬到他的數據。最常見的反爬手段就是對數據進行隱藏處理,這個時候,你就無法直接爬取相關的數據了。作為爬蟲方,如果需要在這種情況下獲取數據,那麼你需要對相應的數據進行抓包分析,然後再根據分析結果進行處理。一般推薦掌握的抓包分析工具是Fiddler,當然你也可以用其他的抓包分析工具,沒有特別的要求。

5、精通一款爬蟲框架

事實上,當你學習到這一步的時候,你已經入門了。

這個時候,你可能需要深入掌握一款爬蟲框架,因為採用框架開發爬蟲項目,效率會更加高,並且項目也會更加完善。

同樣,你可以有很多爬蟲框架進行選擇,比如Scrapy、pySpider等等,一樣的,你沒必要每一種框架都精通,只需要精通一種框架即可,其他框架都是大同小異的,當你深入精通一款框架的時候,其他的框架了解一下事實上你便能輕松使用,在此推薦掌握Scrapy框架,當然你可以根據習慣進行選擇。

6、掌握常見的反爬策略與反爬處理策略

反爬,是相對於網站方來說的,對方不想給你爬他站點的數據,所以進行了一些限制,這就是反爬。

反爬處理,是相對於爬蟲方來說的,在對方進行了反爬策略之後,你還想爬相應的數據,就需要有相應的攻克手段,這個時候,就需要進行反爬處理。

事實上,反爬以及反爬處理都有一些基本的套路,萬變不離其宗,這些後面作者會具體提到,感興趣的可以關注。

常見的反爬策略主要有:

IP限制

UA限制

Cookie限制

資源隨機化存儲

動態載入技術

……

對應的反爬處理手段主要有:

IP代理池技術

用戶代理池技術

Cookie保存與處理

自動觸發技術

抓包分析技術+自動觸發技術

……

這些大家在此先有一個基本的思路印象即可,後面都會具體通過實戰案例去介紹。

7、掌握PhantomJS、Selenium等工具的使用

有一些站點,通過常規的爬蟲很難去進行爬取,這個時候,你需要藉助一些工具模塊進行,比如PhantomJS、Selenium等,所以,你還需要掌握PhantomJS、Selenium等工具的常規使用方法。

8、掌握分布式爬蟲技術與數據去重技術

如果你已經學習或者研究到到了這里,那麼恭喜你,相信現在你爬任何網站都已經不是問題了,反爬對你來說也只是一道形同虛設的牆而已了。

但是,如果要爬取的資源非常非常多,靠一個單機爬蟲去跑,仍然無法達到你的目的,因為太慢了。

所以,這個時候,你還應當掌握一種技術,就是分布式爬蟲技術,分布式爬蟲的架構手段有很多,你可以依據真實的伺服器集群進行,也可以依據虛擬化的多台伺服器進行,你可以採用urllib+redis分布式架構手段,也可以採用Scrapy+redis架構手段,都沒關系,關鍵是,你可以將爬蟲任務部署到多台伺服器中就OK。

至於數據去重技術,簡單來說,目的就是要去除重復數據,如果數據量小,直接採用資料庫的數據約束進行實現,如果數據量很大,建議採用布隆過濾器實現數據去重即可,布隆過濾器的實現在Python中也是不難的。

以上是如果你想精通Python網路爬蟲的學習研究路線,按照這些步驟學習下去,可以讓你的爬蟲技術得到非常大的提升。

至於有些朋友問到,使用Windows系統還是Linux系統,其實,沒關系的,一般建議學習的時候使用Windows系統進行就行,比較考慮到大部分朋友對該系統比較數據,但是在實際運行爬蟲任務的時候,把爬蟲部署到Linux系統中運行,這樣效率比較高。由於Python的可移植性非常好,所以你在不同的平台中運行一個爬蟲,代碼基本上不用進行什麼修改,只需要學會部署到Linux中即可。所以,這也是為什麼說使用Windows系統還是Linux系統進行學習都沒多大影響的原因之一。

本篇文章主要是為那些想學習Python網路爬蟲,但是又不知道從何學起,怎麼學下去的朋友而寫的。希望通過本篇文章,可以讓你對Python網路爬蟲的研究路線有一個清晰的了解,這樣,本篇文章的目的就達到了,加油!

本文章由作者韋瑋原創,轉載請註明出處。

⑹ Python中怎麼用爬蟲爬

Python爬蟲可以爬取的東西有很多,Python爬蟲怎麼學?簡單的分析下:
如果你仔細觀察,就不難發現,懂爬蟲、學習爬蟲的人越來越多,一方面,互聯網可以獲取的數據越來越多,另一方面,像 Python這樣的編程語言提供越來越多的優秀工具,讓爬蟲變得簡單、容易上手。
利用爬蟲我們可以獲取大量的價值數據,從而獲得感性認識中不能得到的信息,比如:
知乎:爬取優質答案,為你篩選出各話題下最優質的內容。
淘寶、京東:抓取商品、評論及銷量數據,對各種商品及用戶的消費場景進行分析。
安居客、鏈家:抓取房產買賣及租售信息,分析房價變化趨勢、做不同區域的房價分析。
拉勾網、智聯:爬取各類職位信息,分析各行業人才需求情況及薪資水平。
雪球網:抓取雪球高回報用戶的行為,對股票市場進行分析和預測。
爬蟲是入門Python最好的方式,沒有之一。Python有很多應用的方向,比如後台開發、web開發、科學計算等等,但爬蟲對於初學者而言更友好,原理簡單,幾行代碼就能實現基本的爬蟲,學習的過程更加平滑,你能體會更大的成就感。
掌握基本的爬蟲後,你再去學習Python數據分析、web開發甚至機器學習,都會更得心應手。因為這個過程中,Python基本語法、庫的使用,以及如何查找文檔你都非常熟悉了。
對於小白來說,爬蟲可能是一件非常復雜、技術門檻很高的事情。比如有人認為學爬蟲必須精通 Python,然後哼哧哼哧系統學習 Python 的每個知識點,很久之後發現仍然爬不了數據;有的人則認為先要掌握網頁的知識,遂開始 HTMLCSS,結果入了前端的坑,瘁……
但掌握正確的方法,在短時間內做到能夠爬取主流網站的數據,其實非常容易實現,但建議你從一開始就要有一個具體的目標。
在目標的驅動下,你的學習才會更加精準和高效。那些所有你認為必須的前置知識,都是可以在完成目標的過程中學到的。這里給你一條平滑的、零基礎快速入門的學習路徑。
1.學習 Python 包並實現基本的爬蟲過程
2.了解非結構化數據的存儲
3.學習scrapy,搭建工程化爬蟲
4.學習資料庫知識,應對大規模數據存儲與提取
5.掌握各種技巧,應對特殊網站的反爬措施
6.分布式爬蟲,實現大規模並發採集,提升效率

⑺ 如何應對網站反爬蟲策略如何高效地爬大量數據

應對反爬策略的方法:1、模擬正常用戶。反爬蟲機制還會利用檢測用戶的行為來判斷,例如Cookies來判斷是不是有效的用戶。

2、動態頁面限制。有時候發現抓取的信息內容空白,這是因為這個網站的信息是通過用戶的XHR動態返回內容信息。解決這種問題就要爬蟲程序對網站進行分析,找到內容信息並抓取,才能獲取內容。

3、降低IP訪問頻率。有時候平台為了阻止頻繁訪問,會設置IP在規定時間內的訪問次數,超過次數就會禁止訪問。所以繞過反爬蟲機制可以降低爬蟲的訪問頻率,還可以用IPIDEA代理IP換IP解決限制。

⑻ 怎麼查看谷歌蜘蛛爬行網站的路徑

用一些站長工具模擬

⑼ 爬蟲 打開網址

C#特別適合於構造蜘蛛程序,這是因為它已經內置了HTTP訪問和多線程的能力,而這兩種能力對於蜘蛛程序來說都是非常關鍵的。下面是構造一個蜘蛛程序要解決的關鍵問題:
⑴ HTML分析:需要某種HTML解析器來分析蜘蛛程序遇到的每一個頁面。
⑵ 頁面處理:需要處理每一個下載得到的頁面。下載得到的內容可能要保存到磁碟,或者進一步分析處理。
⑶ 多線程:只有擁有多線程能力,蜘蛛程序才能真正做到高效。
⑷ 確定何時完成:不要小看這個問題,確定任務是否已經完成並不簡單,尤其是在多線程環境下。
一、HTML解析

本文提供的HTML解析器由ParseHTML類實現,使用非常方便:首先創建該類的一個實例,然後將它的Source屬性設置為要解析的HTML文檔:

ParseHTML parse = new ParseHTML();
parse.Source = "<p>Hello World</p>";
接下來就可以利用循環來檢查HTML文檔包含的所有文本和標記。通常,檢查過程可以從一個測試Eof方法的while循環開始:

while(!parse.Eof())
{
char ch = parse.Parse();

Parse方法將返回HTML文檔包含的字元--它返回的內容只包含那些非HTML標記的字元,如果遇到了HTML標記,Parse方法將返回0值,表示現在遇到了一個HTML標記。遇到一個標記之後,我們可以用GetTag()方法來處理它。

if(ch==0)
{
HTMLTag tag = parse.GetTag();
}

一般地,蜘蛛程序最重要的任務之一就是找出各個HREF屬性,這可以藉助C#的索引功能完成。例如,下面的代碼將提取出HREF屬性的值(如果存在的話)。

Attribute href = tag["HREF"];
string link = href.Value;

獲得Attribute對象之後,通過Attribute.Value可以得到該屬性的值。

二、處理HTML頁面

下面來看看如何處理HTML頁面。首先要做的當然是下載HTML頁面,這可以通過C#提供的HttpWebRequest類實現:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(m_uri);
response = request.GetResponse();
stream = response.GetResponseStream();

接下來我們就從request創建一個stream流。在執行其他處理之前,我們要先確定該文件是二進制文件還是文本文件,不同的文件類型處理方式也不同。下面的代碼確定該文件是否為二進制文件。

if( !response.ContentType.ToLower().StartsWith("text/") )
{
SaveBinaryFile(response);
return null;
}
string buffer = "",line;

如果該文件不是文本文件,我們將它作為二進制文件讀入。如果是文本文件,首先從stream創建一個StreamReader,然後將文本文件的內容一行一行加入緩沖區。

reader = new StreamReader(stream);
while( (line = reader.ReadLine())!=null )
{
buffer+=line+"\r\n";
}

裝入整個文件之後,接著就要把它保存為文本文件。

SaveTextFile(buffer);

下面來看看這兩類不同文件的存儲方式。

二進制文件的內容類型聲明不以"text/"開頭,蜘蛛程序直接把二進制文件保存到磁碟,不必進行額外的處理,這是因為二進制文件不包含HTML,因此也不會再有需要蜘蛛程序處理的HTML鏈接。下面是寫入二進制文件的步驟。

首先准備一個緩沖區臨時地保存二進制文件的內容。 byte []buffer = new byte[1024];

接下來要確定文件保存到本地的路徑和名稱。如果要把一個myhost.com網站的內容下載到本地的c:\test文件夾,二進制文件的網上路徑和名稱是http://myhost.com/images/logo.gif,則本地路徑和名稱應當是c:\test\images\logo.gif。與此同時,我們還要確保c:\test目錄下已經創建了images子目錄。這部分任務由convertFilename方法完成。

string filename = convertFilename( response.ResponseUri );

convertFilename方法分離HTTP地址,創建相應的目錄結構。確定了輸出文件的名字和路徑之後就可以打開讀取Web頁面的輸入流、寫入本地文件的輸出流。

Stream outStream = File.Create( filename );
Stream inStream = response.GetResponseStream();

接下來就可以讀取Web文件的內容並寫入到本地文件,這可以通過一個循環方便地完成。

int l;
do
{
l = inStream.Read(buffer,0,
buffer.Length);
if(l>0)
outStream.Write(buffer,0,l);
} while(l>0);

三、多線程

我們用DocumentWorker類封裝所有下載一個URL的操作。每當一個DocumentWorker的實例被創建,它就進入循環,等待下一個要處理的URL。下面是DocumentWorker的主循環:

while(!m_spider.Quit )
{
m_uri = m_spider.ObtainWork();

m_spider.SpiderDone.WorkerBegin();
string page = GetPage();
if(page!=null)
ProcessPage(page);
m_spider.SpiderDone.WorkerEnd();
}

這個循環將一直運行,直至Quit標記被設置成了true(當用戶點擊"Cancel"按鈕時,Quit標記就被設置成true)。在循環之內,我們調用ObtainWork獲取一個URL。ObtainWork將一直等待,直到有一個URL可用--這要由其他線程解析文檔並尋找鏈接才能獲得。Done類利用WorkerBegin和WorkerEnd方法來確定何時整個下載操作已經完成。

從圖一可以看出,蜘蛛程序允許用戶自己確定要使用的線程數量。在實踐中,線程的最佳數量受許多因素影響。如果你的機器性能較高,或者有兩個處理器,可以設置較多的線程數量;反之,如果網路帶寬、機器性能有限,設置太多的線程數量其實不一定能夠提高性能。

四、任務完成了嗎?

利用多個線程同時下載文件有效地提高了性能,但也帶來了線程管理方面的問題。其中最復雜的一個問題是:蜘蛛程序何時才算完成了工作?在這里我們要藉助一個專用的類Done來判斷。

首先有必要說明一下"完成工作"的具體含義。只有當系統中不存在等待下載的URL,而且所有工作線程都已經結束其處理工作時,蜘蛛程序的工作才算完成。也就是說,完成工作意味著已經沒有等待下載和正在下載的URL。

Done類提供了一個WaitDone方法,它的功能是一直等待,直到Done對象檢測到蜘蛛程序已完成工作。下面是WaitDone方法的代碼。

public void WaitDone()
{
Monitor.Enter(this);
while ( m_activeThreads>0 )
{
Monitor.Wait(this);
}
Monitor.Exit(this);
}

WaitDone方法將一直等待,直到不再有活動的線程。但必須注意的是,下載開始的最初階段也沒有任何活動的線程,所以很容易造成蜘蛛程序一開始就立即停止的現象。為解決這個問題,我們還需要另一個方法WaitBegin來等待蜘蛛程序進入"正式的"工作階段。一般的調用次序是:先調用WaitBegin,再接著調用WaitDone,WaitDone將等待蜘蛛程序完成工作。下面是WaitBegin的代碼:

public void WaitBegin()
{
Monitor.Enter(this);
while ( !m_started )
{
Monitor.Wait(this);
}
Monitor.Exit(this);
}

WaitBegin方法將一直等待,直到m_started標記被設置。m_started標記是由WorkerBegin方法設置的。工作線程在開始處理各個URL之時,會調用WorkerBegin;處理結束時調用WorkerEnd。WorkerBegin和WorkerEnd這兩個方法幫助Done對象確定當前的工作狀態。下面是WorkerBegin方法的代碼:

public void WorkerBegin()
{
Monitor.Enter(this);
m_activeThreads++;
m_started = true;
Monitor.Pulse(this);
Monitor.Exit(this);
}

WorkerBegin方法首先增加當前活動線程的數量,接著設置m_started標記,最後調用Pulse方法以通知(可能存在的)等待工作線程啟動的線程。如前所述,可能等待Done對象的方法是WaitBegin方法。每處理完一個URL,WorkerEnd方法會被調用:

public void WorkerEnd()
{
Monitor.Enter(this);
m_activeThreads--;
Monitor.Pulse(this);
Monitor.Exit(this);
}

WorkerEnd方法減小m_activeThreads活動線程計數器,調用Pulse釋放可能在等待Done對象的線程--如前所述,可能在等待Done對象的方法是WaitDone方法。