目前網頁采集多是3P代碼(3P是ASP,PHP,JSP)。易動易科技公司BBS中最具代表性的新聞采集系統,網上流傳的新浪新聞采集系統,都是ASP程序使用,但是理論上速度不是很好。用其他軟件嘗試多線程采集是不是更快?答案是肯定的。可以用DELPHI,VC,VB,JB,但是PB好像很難做。下面用DELPHI來說明網頁數據的收集。
簡單的新聞采集
新聞采集最簡單,只要妳識別標題、副標題、作者、來源、日期、新聞主題、分頁。妳必須在采集之前獲取網頁的內容,所以在DELPHI中添加idHTTP控件(在indy Clients面板中),然後使用idHTTP1。獲取網頁內容的GET方法。聲明如下:
函數Get(AURL:string):string;超載;
AURL參數,字符串類型,指定URL地址字符串。該函數返回壹個字符串,該字符串返回網頁的HTML源文件。例如,我們可以
像這樣打電話:
tmpStr:= idHTTP1。獲取('
調用成功後,網易首頁的代碼存儲在tmpstr變量中。
接下來說說數據攔截。在這裏,我定義了這樣壹個函數:
函數TForm1。GetStr(StrSource,StrBegin,StrEnd:string):string;
定義變量
in_star,in_end:整數;
開始
in_star:=AnsiPos(strbegin,strsource)+length(str begin);
in_end:=AnsiPos(strend,strsource);
結果:=copy(strsource,in_sta,in _ end-in _ star);
結束;
StrSource:表示HTML源文件的字符串。
StrBegin:指示攔截開始標記的字符串。
StrEnd:字符串,表示攔截結束的標誌。
該函數將字符串StrSource中的壹段文本從StrSource返回到StrBegin。
例如:
strtmp:=TForm1。GetStr('A123BCD ',' A ',' BC ');
運行後,strtmp的值為' 123 '。
函數中使用的AnsiPos和copy都是由系統定義的。可以在delphi的幫助文件中找到相關說明,我在這裏簡單說壹下:
函數AnsiPos(const Substr,S: string): Integer
返回Substr在s中首次出現的位置。
函數copy(strsource,in_sta,in _ end-in _ star):string;
返回字符串strsource中從in_sta(整數數據)到in_end-in_star(整數數據)的字符串。
通過以上功能,我們可以通過設置各種標簽來截取我們想要的文章內容。在程序中,我們需要設置許多標記,這很麻煩。為了定位某個內容,我們必須設置它的開始和結束標記。比如妳想獲取網頁上的壹篇文章的標題,妳必須事先檢查網頁代碼,在文章標題前後檢查出壹些特征碼,通過這些特征碼截取文章的標題。
假設要收集的文章的地址是
代碼是:
超文本標記語言
頭
元"
meta name = " GENERATOR " content = " Microsoft front page 5.0 "
meta name = " ProgId " content = " front page。編輯器.文檔"
meta http-equiv = " Content-Type " Content = " text/html;charset=gb2312 "
標題新網頁1/標題
/頭
身體
P align = " center文章標題/b/p
table border = " 1 " cell padding = " 0 " cellspacing = " 0 " style = " border-collapse:collapse " border color = " # 11111 " width = " 100% " id = " autonumber 1 "
Trtd width="60% "作者/td
Td width="40% "source /td/tr
/表格
Pfont size="2 "這裏是文章的正文。/font/p
A href= '..new_pr.asp '上壹個/a a href='new_ne.asp '下壹個/a
/body
/html
第壹步,我們用strsource:= idhttp 1 . get(');將網頁代碼保存在strsource變量中。
然後定義strTitle,strAuthor,strCopyFrom,strContent:
strTitle:= GetStr(StrSource,' p align="center"b ','/b/p '):
strAuthor:= GetStr(StrSource,' trtd width="60% " ','/td '):
strCopyFrom:= GetStr(StrSource,' td width="40% " ','/td/tr '):
strContent:= GetStr(StrSource,' pfont size="2 ",'/font/p '):
這樣就可以將文章的標題、副標題、作者、來源、日期、內容、分頁分別存儲在上述變量中。
第二步,循環打開下壹頁,獲取內容並添加到strContent變量中。
StrSource:= idHTTP1。get(' new _ ne . ASP ');
str content:= str content+GetStr(StrSource,' pfont size="2 ",'/font/p '):
然後判斷是否有下壹頁,如果有,則獲取下壹頁的內容。
這就完成了壹個簡單的攔截過程。從上面的程序代碼可以看出,我們使用的所有攔截方法都是為了找到被攔截內容的首尾。如果有多個頭和尾呢?好像沒有辦法,只會找到第壹個,所以妳要核實壹下這個截取內容的正反面是不是只有壹個地方,再去找。