網絡爬蟲之簡單鏈接抓取

繼續用word編輯以後截圖~


# -*- coding: utf-8 -*-
import re      #導入正則表達式re 模塊
import urllib2
import string  #導入string模塊
def saveUrl(urlSeed):
#函數作用:
#利用參數中的url網址,得到url對於的網頁,然後抓取網頁內容,獲取網頁之中的所有超鏈接及其對應的鏈接名字,保存在文本文件中。    
    website=urllib2.Request(urlSeed);        #向網站請求訪問
    if (not website):   	             #如果訪問失敗,那麼說明網頁有問題,跳出程序(下面的return),不執行下面的代碼
        return;
    webpage=urllib2.urlopen(website).read(); #打開網站(urlopen)並讀取數據(read)這裏把urlopen()和read()兩個方法合在一起使用了。
    pattern=re.compile(r"<a href=\".*?\".*?>.*?<\/a>"); #構建正則表達式
    result=pattern.findall(webpage);         #正則表達式匹配網頁
    for subweb in result:                    #result是一個列表[就像matlab中的矩陣]
        #print subweb;                       #打印網頁,此處把它註釋掉了
        pattern2=re.compile(r"http.*?\"");   #構造正則表達式2,獲取網址
        pattern3=re.compile(r">.*?<");    	 #正則表達式3,獲取網址名字
        weburl=pattern2.findall(subweb);  	 #正則表達式2匹配
        webname=pattern3.findall(subweb);	 #正則表達式3匹配
        if len(weburl)>0 and len(webname)>0: #如果匹配的結果非空,即有結果,這裏需要網址和名字都有結果,否則認爲數據不符合
            for name in webname:             #因爲名字裏面有可能有多個結果,其中包括正確的”>名字<“,不正確的“><”,
                if len(name)>2:              #因爲錯誤的“><”長度爲2,正確的“>網頁名字<”長度必須大於2,所以以此爲特徵過濾錯誤的
                    forCheck=name[name.index('>')+1:name.index('<')];#利用切片方式去除名字頭尾的‘>’和‘<’;可以用print name; 看是什麼樣子的。                                  
                    pattern=re.compile('[%s]' % string.punctuation) #構造正則表達式檢測名字裏面是否包含標點符號,
                    if not pattern.findall(forCheck):               #如果不存在,認爲是合格數據
                        print forCheck+':'+weburl[0][0:len(weburl[0])-1];#打印合格的數據,格式爲: 網站名字+:號+地址;
                        fpWrite=open("./web.txt",'a');                  #以追加的方式打開文本文件,如果不存在,則創建
                        dataWrite= forCheck+':'+weburl[0][0:len(weburl[0])-1]+'\r\n';#構建即將寫入的數據格式(跟打印的格式一樣)
                        fpWrite.write(dataWrite);   #把數據寫入文件
                        fpWrite.close();            #關閉文件
                        
def run(urlSeed):
#函數作用,根據給定的urlSeed,獲取第一批超鏈接,寫入文本文件;
#然後,以第一批網址爲基礎,依次抽取每一行的地址作爲新的url,獲取另一批新的url,以此反覆循環,直到用戶按下終止鍵(ctrl+z),停止程序。
    saveUrl(urlSeed);#調用上面的函數;獲取第一批的網址
    fpRead=open("./web.txt",'r');#打開第一批的文本文件,
    while(1):                           #死循環
        try:
            dataRead=fpRead.readline();#從打開的文件中讀取一行
            pattern=re.compile(r"http.*");#構造正則表達式
            newUrl=pattern.findall(dataRead);#利用正則表達式從讀入的行中獲取網址
            saveUrl(newUrl[0]);#將新的網址作爲參數,獲取新的一批網址
        except KeyboardInterrupt:   #如果檢測到鍵盤中斷異常,說明用戶按下了Ctrl+Z
            fpRead.close();         #關閉讀寫文件
            print "\n爬蟲執行完成!\n"   #打印退出結果
            return;                 #退出程序
        except Exception,e:         #如果是其他異常,不理它們
            continue;               #跳過異常,繼續運行
    fpRead.close();                 #關閉文件


#下面是程序的入口,程序調用run函數開始運行,傳入種子url(這裏以淘寶爲例)。
run("http://www.taobao.com");

pdf版內容及對應代碼位置:http://download.csdn.net/detail/duishengchen/8057129


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章