c 多執行緒抓取網頁內容

2021-06-01 08:03:17 字數 3028 閱讀 2785

1.

2.

好了,認識、分析完問題,就是解決問題了:

多執行緒在c#中並不難實現。它有乙個命名空間:system.threading

,提供了多執行緒的支援。

要開啟乙個新執行緒,需要以下的初始化:

threadstart startdownload = new threadstart( download );//

執行緒起始設定:即每個執行緒都執行download(),注意:download()必須為不帶有引數的方法

thread downloadthread = new thread( startdownload );//

例項化要開啟的新類

downloadthread.start();//

開啟執行緒

1. 如何控制線程的數量?

2.3.

如何判斷執行緒結束?

4.如何控制線程結束?

下面就這幾個問題提出解決方法:

1.執行緒數量我們可以通過for迴圈來實現,就如同當年初學程式設計的打點程式一樣。

比如已知使用者指定了n(它是乙個int型變數)個執行緒吧,可以用如下方法開啟五個執行緒

thread downloadthread;//

threadstart startdownload = new threadstart( download );//

執行緒起始設定:即每個執行緒都執行download()

downloadthread = new thread[ n ];//

為執行緒申請資源,確定執行緒總數

for( int i = 0; i < n; i++ )//

開啟指定數量的執行緒數

好了,實現控制開啟執行緒數是不是很簡單啊?

2.

《建立表》

create table

(ctablename) ( curl m , ctext m , ldowned i , threadnum i ) &&

<

提取url位址》

cfullname = (ctablename) + '.dbf'

&&為表新增副檔名

use

(cfullname) 

go top

locate for

(empty

( alltrim

( ctext ) ) and ldowned < 2 and ( threadnum = thisnum or threadnum = - 1) ) &&

goturl = curl

recnum =

recno()

if recnum <=

reccount

() then  

&&如果在列表中找到這樣的url位址

update

(cfullname)

set

ldowned = ( ldowned + 1 ) , threadnum = thisnum

where recno

() = recnum &&

cfulltablename = (ctablename) + '.dbf'

use

(cfulltablename)

set exact on

locate for

curl = (csiteurl)

&&csiteurl

recnumnow =

recno

()&&

得到含有此位址的記錄號

update

(cfulltablename)

set

ctext = (ccontent)

where recno

() = recnumnow

&&插入對應位址的對應內容

《插入新位址》

ctablename = (ctablename) + '.dbf'

use

(ctablename)

go top

set exact on

locate for

curl = (cnewurl)

&&查詢有無此位址

if recno

() >

reccount

() then

&&如果尚無此位址

set carry off

insert into

(ctablename) ( curl , ctext , ldowned , threadnum )

values

( (cnewurl) , "" , 0 , -1 ) 

&&將主頁位址新增到列表

好了,這樣就解決了多執行緒中,執行緒衝突。當然,去重問題也可以在c#語言內解決,只根建立乙個臨時檔案(文字就可以),儲存所有的url位址,差對它們設定相應的屬性即可,但查詢效率可能不及資料庫快。

3.string

url = "";

inttimes = 0;

while

( url == "" )//

如果沒有找到符合條件的記錄,則不斷地尋找符合條件的記錄

if ( times > n )//

如果已經嘗試夠了次數,則退出程序

else

// 如果沒有嘗試夠次數

//進行下一步針對得到的url的處理 }

4.這個問題相對簡單,因為在問題一中已經建議,將執行緒聲名為類級陣列,這樣就很易於控制。只要用乙個for迴圈即可結束。**如下:

for( int i = 0; i < n; i++ )//

關閉指定數量n的執行緒數

好了,乙個蜘蛛程式就這樣完成了,在c#面前,它的實現原來如此簡單。

這裡筆者還想提醒讀者:筆者只是提供了乙個思路及乙個可以實現的解決方案,但它並不是最佳的,即使這個方案本身,也有好多可以改進的地方,留給讀者思考。

最後說明一下我所使用的環境:

winxp sp2 pro

vfp 9.0

visual studio 2003 .net中文企業版

CURL多執行緒抓取網頁

網上這類方法似乎太多了。但是總是有一些問題存在。對於多執行緒抓取,現在有如下幾種思路 1.用apache的多執行緒特性,讓php進行 多程序 操作,就像post本身一樣 2.用curl的curl multi庫 對於第一種,我還沒嘗試,因為這種製造的是偽多執行緒,也許效率會低很多,而且不好控制。第二種...

c 抓取網頁內容

新增的引用 using system.net using system.io using system.io.compression 1.webclient mywebclient new webclient mywebclient.credentials credentialcache.defau...

C 抓取網頁內容

1 抓取一般內容 需要三個類 webrequest webresponse streamreader 所需命名空間 system.net system.io 核心 webrequest request webrequest.create webresponse response request.ge...