上一章咱們使用Python實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的HTTP請(qǐng)求武翎,瞧著簡(jiǎn)單烈炭,爬蟲就是模擬人打開一個(gè)個(gè)URL瀏覽一個(gè)個(gè)網(wǎng)頁(yè)來(lái)爬取數(shù)據(jù)的,一個(gè)成功的HTTP請(qǐng)求宝恶,就是一個(gè)爬蟲的基礎(chǔ)符隙。
接下來(lái),咱們以一個(gè)實(shí)際的例子:爬取百度新聞垫毙,來(lái)介紹使用BeautifulSoup對(duì)HTML進(jìn)行解析處理霹疫。
爬取騰訊新聞
1、尋找數(shù)據(jù)特征
騰訊新聞的網(wǎng)址URL為:http://news.qq.com/
我們打開網(wǎng)頁(yè)看看:
我們需要爬取這個(gè)頁(yè)面每一條新聞的標(biāo)題综芥,鼠標(biāo)右擊一條新聞的標(biāo)題丽蝎,選擇“審查元素”,出現(xiàn)下圖的窗口:
審查元素
圖片中紅框的位置就是那一條新聞標(biāo)題在HTML中的結(jié)構(gòu)膀藐、位置和表現(xiàn)形式:
它上一級(jí)元素為:屠阻,再上一級(jí)元素為:
我們?cè)倏戳硪粭l新聞的標(biāo)題,發(fā)現(xiàn)它的結(jié)構(gòu)和之前我們分析的新聞標(biāo)題的結(jié)構(gòu)是一樣的:
臺(tái)擬將蔡英文賀歲春聯(lián)“自自冉冉”一詞列入辭典
通過(guò)這些信息额各,我們就可以確定新聞標(biāo)題在HTML文檔中的位置国觉。
接下來(lái),我們開始使用Python對(duì)騰訊新聞標(biāo)題進(jìn)行爬取
** 2臊泰、編寫爬取代碼
首先上完整的代碼
運(yùn)行程序蛉加,獲取到的部分結(jié)果為如下所示:
這正是我們所需要的蚜枢。
雖然代碼很簡(jiǎn)單缸逃,但還是做一點(diǎn)點(diǎn)講解,方便剛剛接觸的同學(xué)厂抽。
3需频、代碼解析
# coding:utf-8
首先,我們定義了文件的編碼形式為UTF-8筷凤,以避免一些編碼錯(cuò)誤導(dǎo)致中文亂碼昭殉。
import requests
from bs4 import BeautifulSoup
然后苞七,我們引入了相關(guān)的模塊,requests用于HTTP請(qǐng)求挪丢,BeautifulSoup用于解析HTML響應(yīng)蹂风。
url = "http://news.qq.com/"
設(shè)置一個(gè)變量url,值為騰訊新聞的URL
bdata = requests.get(url).text
使用requests.get()對(duì)URL發(fā)起GET方式的HTTP請(qǐng)求乾蓬,并使用text()方法獲取響應(yīng)的文本內(nèi)容惠啄,最后將其賦值給變量wbdata。
soup = BeautifulSoup(wbdata,'lxml')
使用BeautifulSoup對(duì)響應(yīng)文本wbdata進(jìn)行解析處理任内,這里使用的是lxml庫(kù)撵渡,如何沒(méi)有安裝,可以使用Python自帶的html.parser死嗦,效果也是一樣的趋距。
news_titles = soup.select("div.text > em.f14 > a.linkto")
在解析后的文本中,使用select選擇器越除,在文本中選擇指定的元素节腐,通常我們還會(huì)使用find()和findall()方法來(lái)進(jìn)行元素選擇。
這一步返回的為一個(gè)列表摘盆,列表內(nèi)的元素為匹配的元素的HTML源碼铜跑。
for n in news_titles:
# 提取出標(biāo)題和鏈接信息
title = n.get_text()
link = n.get("href")
data = {'標(biāo)題':title,'鏈接':link}
print(data)
對(duì)結(jié)果列表進(jìn)行遍歷,再?gòu)谋闅v的元素中提取出數(shù)據(jù)骡澈,get(“href”)表示獲取屬性名為“href”的屬性值锅纺,get_text()表示獲取標(biāo)簽的文本信息。
這樣肋殴,一個(gè)簡(jiǎn)單的騰訊新聞爬蟲就完成了囤锉,如果對(duì)requests模塊和BeautifulSoup模塊有更加深的學(xué)習(xí)欲望,可以查看它們的官方文檔护锤。