下面是一段定向爬蟲代碼,用于爬取中國大學(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é)的信息