Python爬蟲學(xué)習(xí)筆記

下面是一段定向爬蟲代碼,用于爬取中國大學(xué)排名沽损,并打印前二十個大學(xué)的信息
代碼來自北京理工大學(xué)的在線課程《Python網(wǎng)絡(luò)爬蟲與信息提取》

import requests
from bs4 import BeautifulSoup
import bs4
def getHTMLText(url):
    try:
        r = requests.get(url, timeout = 30)
        r.raise_for_status
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""

def fillUnivList(ulist, html):
    soup = BeautifulSoup(html, "lxml")
    for tr in soup.find('tbody').children:
        if isinstance(tr, bs4.element.Tag):
            tds = tr('td')
            ulist.append([tds[0].string, tds[1].string, tds[2].string])

def printUnivList(ulist, num):
    tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
    print(tplt.format("排名","學(xué)校名稱","總分",chr(12288)))
    for i in range(num):
        u = ulist[i]
        print(tplt.format(u[0],u[1],u[2],chr(12288)))

def main():
    uinfo = []
    url = "http://www.zuihaodaxue.com/zuihaodaxuepaiming2017.html"
    html = getHTMLText(url)
    fillUnivList(uinfo, html)
    printUnivList(uinfo, 20)

main()

這段代碼包含了四個函數(shù)

  • getHTMLText()
    用于獲取HTML源代碼內(nèi)容
  • fillUnivList()
    用于提取源代碼內(nèi)容中有用的部分
  • printUnivList()
    用于將提取到的有用內(nèi)容打印出來
  • main()
    主函數(shù)逆趋,整合以上三個函數(shù),實現(xiàn)目標(biāo)功能

1.getHTMLText()

def getHTMLText(url):
    try:
        r = requests.get(url, timeout = 30)
        r.raise_for_status
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""

r = requests.get(url, timeout = 30)使用requests庫的get方法狭瞎,設(shè)定timeout為30秒今瀑,得到一個名為r的Response對象
r.raise_for_status在連接失敗時會返回一個異常,此時將直接跳轉(zhuǎn)到except下執(zhí)行return ""語句拗引,以此保證代碼的穩(wěn)定性
r.encoding = r.apparent_encoding一般而言apparent_encoding判斷的編碼格式更準(zhǔn)確借宵,因此本句將r.encoding賦值r.apparent_encoding
return r.text返回url對應(yīng)網(wǎng)頁的內(nèi)容

2.fillUnivList()

def fillUnivList(ulist, html):
    soup = BeautifulSoup(html, "lxml")
    for tr in soup.find('tbody').children:
        if isinstance(tr, bs4.element.Tag):
            tds = tr('td')
            ulist.append([tds[0].string, tds[1].string, tds[2].string])

soup = BeautifulSoup(html, "lxml")使用lxml解析器解析html內(nèi)容,此處也可以使用html.parser

<tbody class="hidden_zhpm" style="text-align:center;">
                <tr class="alt"><td>1<td><div align="left">清華大學(xué)</div></td><td>北京</td><td>94.0 </td><td class="hidden-xs need-hidden indicator5">100.0 

查看網(wǎng)頁源代碼矾削,我們發(fā)現(xiàn)大學(xué)信息在tbody標(biāo)簽下壤玫,每個tr標(biāo)簽對應(yīng)一所大學(xué),tr標(biāo)簽下的td標(biāo)簽則對應(yīng)大學(xué)的各項信息
因此我們在解析出的內(nèi)容soup中找到tbody標(biāo)簽的各個子節(jié)點即tr哼凯,由于一些文本內(nèi)容也屬于節(jié)點欲间,我們用if isinstance(tr, bs4.element.Tag)語句對tr的類型進行判斷,確保tr是標(biāo)簽
tds = tr('td')將在tr下找到所有td標(biāo)簽內(nèi)容并以列表形式存入tds
ulist.append([tds[0].string, tds[1].string, tds[2].string])將tds的前三個內(nèi)容存入ulist
注意此處的ulist是一個多維列表断部,其包含數(shù)個含有三個元素的列表

3.printUnivList()

def printUnivList(ulist, num):
    tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
    print(tplt.format("排名","學(xué)校名稱","總分",chr(12288)))
    for i in range(num):
        u = ulist[i]
        print(tplt.format(u[0],u[1],u[2],chr(12288)))

print(tplt.format("排名","學(xué)校名稱","總分",chr(12288)))格式化打印表頭猎贴,chr(12288)是中文空格,用于填補空缺家坎,防止由于中英文占位不同引起格式混亂
做循環(huán)print(tplt.format(u[0],u[1],u[2],chr(12288)))打印各個學(xué)校的信息

4.main()

def main():
    uinfo = []
    url = "http://www.zuihaodaxue.com/zuihaodaxuepaiming2017.html"
    html = getHTMLText(url)
    fillUnivList(uinfo, html)
    printUnivList(uinfo, 20)

html = getHTMLText(url)使用getHTMLText()方法獲取url的網(wǎng)頁源碼內(nèi)容嘱能,存入html變量
fillUnivList(uinfo, html)使用fillUnivList()方法填充uinfo列表
printUnivList(uinfo, 20)打印前二十個大學(xué)的信息

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市虱疏,隨后出現(xiàn)的幾起案子惹骂,更是在濱河造成了極大的恐慌,老刑警劉巖做瞪,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件对粪,死亡現(xiàn)場離奇詭異,居然都是意外死亡装蓬,警方通過查閱死者的電腦和手機控漠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門迅腔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颇象,“玉大人安疗,你說我怎么就攤上這事“蹈希” “怎么了鄙币?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蹂随。 經(jīng)常有香客問我十嘿,道長,這世上最難降的妖魔是什么岳锁? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任绩衷,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘咳燕。我一直安慰自己勿决,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布招盲。 她就那樣靜靜地躺著剥险,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宪肖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天健爬,我揣著相機與錄音控乾,去河邊找鬼。 笑死娜遵,一個胖子當(dāng)著我的面吹牛蜕衡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播设拟,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼慨仿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了纳胧?” 一聲冷哼從身側(cè)響起镰吆,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎跑慕,沒想到半個月后万皿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡核行,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年牢硅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芝雪。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡减余,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惩系,到底是詐尸還是另有隱情位岔,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布蛆挫,位于F島的核電站赃承,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏悴侵。R本人自食惡果不足惜瞧剖,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧抓于,春花似錦做粤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至巾遭,卻和暖如春肉康,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背灼舍。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工吼和, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人骑素。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓炫乓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親献丑。 傳聞我的和親對象是個殘疾皇子末捣,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 結(jié)構(gòu)安排 一至十八是第一部分; 十九至二十六是第二部分创橄。 一箩做、大數(shù)據(jù)時代的挑戰(zhàn) 數(shù)據(jù)抽取、轉(zhuǎn)換妥畏、存儲 (Data ...
    陳半仙兒閱讀 4,209評論 1 5
  • 1 Python 1.1 Shebang line 在IDLE下運行可以不考慮shebang line(幫助操作系...
    ChaseChoi閱讀 566評論 0 0
  • 我們每個人咖熟,都覺得自己是顆光芒耀眼的大鉆石圃酵,實際上在世界上,在別人看來馍管,我們就是比沙土更渺小的塵埃郭赐。但是,那又怎樣确沸。
    艾尚萱閱讀 234評論 0 0
  • 新手媽媽們捌锭,在沉浸于喜悅中,也要了解一些照顧寶寶的這些小細節(jié)罗捎,剛出生的baby需要媽媽的全心呵護呢观谦!因此細節(jié)雖小但...
    Angelcare閱讀 287評論 0 0
  • 今天下午接受了一場教練式提問的學(xué)習(xí),改變了自己的一些固定的思維模式桨菜,覺得很有必要把自己的一些想法寫出來豁状。 在這之前...
    舒拉_閱讀 506評論 0 0