Python爬蟲(chóng)之爬取靜態(tài)網(wǎng)頁(yè)

所謂網(wǎng)絡(luò)爬蟲(chóng)仪媒,通俗的講狸眼,就是通過(guò)向我們需要的URL發(fā)出http請(qǐng)求藤树,獲取該URL對(duì)應(yīng)的http報(bào)文主體內(nèi)容,之后提取該報(bào)文主體中我們所需要的信息拓萌。所以岁钓,想要學(xué)習(xí)python爬蟲(chóng),需要具備一些http的基礎(chǔ)知識(shí)微王,熟悉http請(qǐng)求的基本過(guò)程屡限。在本文中,首先會(huì)簡(jiǎn)單的介紹一下http請(qǐng)求的基本流程炕倘,之后介紹python的requests庫(kù)钧大,requests庫(kù)可以方便地幫助我們完成http請(qǐng)求。因?yàn)楸疚慕榻B的是爬取靜態(tài)網(wǎng)頁(yè)罩旋,所以請(qǐng)求相應(yīng)的URL之后啊央,我們需要對(duì)其中的信息進(jìn)行提取,這時(shí)候就需要BeautifulSoup庫(kù)涨醋,它可以輕松的找出我們需要的信息瓜饥,當(dāng)然,有時(shí)候借助正則表達(dá)式會(huì)更快地幫助我們抽取網(wǎng)頁(yè)中我們需要的信息浴骂。最后乓土,我們會(huì)通過(guò)一個(gè)例子,對(duì)靜態(tài)網(wǎng)頁(yè)的爬取過(guò)程做一個(gè)具體的實(shí)現(xiàn)溯警。

http基本知識(shí)

當(dāng)我們通過(guò)瀏覽器訪問(wèn)指定的URL時(shí)趣苏,需要遵守http協(xié)議。本節(jié)將介紹一些關(guān)于http的基礎(chǔ)知識(shí)梯轻。

http基本流程

我們打開(kāi)一個(gè)網(wǎng)頁(yè)的過(guò)程食磕,就是一次http請(qǐng)求的過(guò)程。這個(gè)過(guò)程中喳挑,我們自己的主機(jī)充當(dāng)著客戶機(jī)的作用芬为,而充當(dāng)客戶端的是瀏覽器萄金。我們輸入的URL對(duì)應(yīng)著網(wǎng)絡(luò)中某臺(tái)服務(wù)器上面的資源,服務(wù)器接收到客戶端發(fā)出的http請(qǐng)求之后媚朦,會(huì)給客戶端一個(gè)響應(yīng)氧敢,響應(yīng)的內(nèi)容就是請(qǐng)求的URL對(duì)應(yīng)的內(nèi)容,當(dāng)客戶端接收到服務(wù)器的響應(yīng)時(shí)询张,我們就可以在瀏覽器上看見(jiàn)請(qǐng)求的信息了孙乖。這一過(guò)程如下圖所示:

http請(qǐng)求過(guò)程.png

知道了http的基本請(qǐng)求過(guò)程,就可以通過(guò)代碼進(jìn)行體驗(yàn)了份氧。

通過(guò)requests發(fā)起http請(qǐng)求

我們可以通過(guò)python的requests模塊很方便的發(fā)起http請(qǐng)求唯袄。requests模塊是第三方模塊,安裝完成之后直接import就能使用蜗帜。下面介紹一些簡(jiǎn)單的用法恋拷,更多的使用方法可以參考如下鏈接:
requests

發(fā)起請(qǐng)求

import requests
# 請(qǐng)求的首部信息
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'
}
# 例子的url
url = 'https://voice.hupu.com/nba' # 虎撲nba新聞
# 利用requests對(duì)象的get方法,對(duì)指定的url發(fā)起請(qǐng)求
# 該方法會(huì)返回一個(gè)Response對(duì)象
res = requests.get(url, headers=headers)
# 通過(guò)Response對(duì)象的text方法獲取網(wǎng)頁(yè)的文本信息
print(res.text)

上面的代碼中厅缺,我們向虎撲的服務(wù)器發(fā)送了一個(gè)get請(qǐng)求蔬顾,獲取虎撲首頁(yè)的nba新聞。headers參數(shù)指的是http請(qǐng)求的首部信息湘捎,我們請(qǐng)求的url對(duì)應(yīng)的資源是虎撲nba新聞的首頁(yè)诀豁。獲取到對(duì)應(yīng)的網(wǎng)頁(yè)資源之后,我們需要對(duì)其中的信息進(jìn)行提取窥妇。

通過(guò)BeautifulSoup提取網(wǎng)頁(yè)信息

BeautifulSoup庫(kù)提供了很多解析html的方法舷胜,可以幫助我們很方便地提取我們需要的內(nèi)容。我們這里說(shuō)的BeautifulSoup指的是bs4活翩。當(dāng)我們成功抓取網(wǎng)頁(yè)之后烹骨,就可以通過(guò)BeautifulSoup對(duì)象對(duì)網(wǎng)頁(yè)內(nèi)容進(jìn)行解析。在BeautifulSoup中材泄,我們最常用的方法就是find()方法和find_all()方法沮焕,借助于這兩個(gè)方法,可以輕松地獲取到我們需要的標(biāo)簽或者標(biāo)簽組脸爱。關(guān)于其他的方法遇汞,可以參考bs4的官方文檔:BeautifulSoup
find()方法和find_all()方法的用法如下:

find(name , attrs , recursive , string , **kwargs )
# find_all()方法將返回文檔中符合條件的所有tag未妹,
find_all(name , attrs , recursive , string , **kwargs )

大多情況下我們只會(huì)用到前兩個(gè)參數(shù)簿废。具體用法如下:

from bs4 import BeautifulSoup
# BeautifulSoup對(duì)象接收html文檔字符串
# lxml是html解析器
soup = Beautiful(res.text, 'lxml')
# 下面的方法找出了所有class為hello的span標(biāo)簽
# 并將所有的結(jié)果都放入一個(gè)list返回
tags = soup.find_all('span', {'class': 'hello'})

在我們真正開(kāi)始爬蟲(chóng)的時(shí)候,還需要對(duì)網(wǎng)頁(yè)的DOM結(jié)構(gòu)進(jìn)行分析络它,這樣才能知道應(yīng)該如何提取我們需要的信息族檬,下面將會(huì)結(jié)合一個(gè)例子對(duì)DOM結(jié)構(gòu)進(jìn)行分析。

靜態(tài)網(wǎng)頁(yè)爬蟲(chóng)實(shí)戰(zhàn)

在本節(jié)的例子里面化戳,我們將對(duì)虎撲nba首頁(yè)所有新聞的標(biāo)題和來(lái)源進(jìn)行爬取单料。首先我們導(dǎo)入我們所需要的requests和bs4模塊埋凯,然后向目標(biāo)url發(fā)出get請(qǐng)求獲取首頁(yè)的html文檔。具體如下:

import requests
from bs4 import BeautifulSoup

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'
}
url = 'https://voice.hupu.com/nba' # 虎撲nba新聞
res = requests.get(url, headers=headers)

我們的目的是提取新聞的標(biāo)題和來(lái)源扫尖,所以下一步需要對(duì)新聞首頁(yè)的DOM結(jié)構(gòu)進(jìn)行分析白对。給出新聞首頁(yè)的截圖如下:

虎撲nba新聞首頁(yè).png

畫(huà)紅線的部分就是我們要爬取的信息,下面通過(guò)chrome控制臺(tái)對(duì)DOM結(jié)構(gòu)進(jìn)行分析换怖。結(jié)果如下圖:

DOM分析結(jié)果.png

本著從特殊到一般的思路進(jìn)行搜索甩恼,通過(guò)一個(gè)新聞信息進(jìn)行分析,找出所有新聞的共性沉颂。通過(guò)分析發(fā)現(xiàn)条摸,我們需要的標(biāo)題信息是一個(gè)a標(biāo)簽對(duì)應(yīng)的內(nèi)容,然后我們需要向上進(jìn)行搜索铸屉,可見(jiàn)標(biāo)題信息的上一級(jí)是一個(gè)h4標(biāo)簽钉蒲,h4標(biāo)簽的上一級(jí)是一個(gè)class屬性值為list-hd的div標(biāo)簽,這個(gè)div的上一級(jí)是一個(gè)li標(biāo)簽彻坛。用通過(guò)同樣的思路對(duì)來(lái)源信息進(jìn)行分析顷啼,我們發(fā)現(xiàn),新聞標(biāo)題信息和新聞來(lái)源信息都在一個(gè)li標(biāo)簽下面小压,進(jìn)一步可以發(fā)現(xiàn)线梗,其他的新聞信息都在這類(lèi)li標(biāo)簽下,這些li標(biāo)簽都在class屬性值為news-list的div標(biāo)簽下怠益,而且整片文檔中仪搔,class屬性值為news-list的div標(biāo)簽也只有這一個(gè)。

因此蜻牢,我們可以從這個(gè)div入手烤咧,找到這個(gè)標(biāo)簽下的每一個(gè)li標(biāo)簽,對(duì)每一個(gè)li標(biāo)簽進(jìn)行遍歷抢呆,每一個(gè)li標(biāo)簽下有唯一的h4標(biāo)簽煮嫌,該標(biāo)簽的文本即為我們要找的標(biāo)題信息;另外抱虐,每一個(gè)li標(biāo)簽下也僅僅有一個(gè)class屬性值為comeFrom的span標(biāo)簽昌阿,該span標(biāo)簽下的a標(biāo)簽對(duì)應(yīng)的文本就是來(lái)源信息。分析結(jié)束之后恳邀,我們就可以通過(guò)bs4進(jìn)行信息提取了懦冰。代碼如下:

soup = BeautifulSoup(res.text, 'lxml')

# 找出class屬性值為news-list的div
news_list = soup.find('div', {'class': 'news-list'})
# 找出news_list下的所有l(wèi)i標(biāo)簽
news = news_list.find_all('li')
news_titles = []
news_source = []

# 遍歷news
for i in news:
    try:
        # 提取新聞標(biāo)題
        title = i.find('h4').get_text().strip()
        # 提取新聞來(lái)源
        source = i.find('span', {'class': 'comeFrom'}).find('a').get_text().strip()
        # 存儲(chǔ)爬取結(jié)果
        news_titles.append(title)
        news_source.append(source)
        print('新聞標(biāo)題:', title)
        print('新聞來(lái)源:', source)
        print()
    except AttributeError as e:
        continue

爬取結(jié)果如下圖:

爬取結(jié)果.png

如有錯(cuò)誤,還請(qǐng)指正

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谣沸,一起剝皮案震驚了整個(gè)濱河市刷钢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乳附,老刑警劉巖内地,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伴澄,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡阱缓,警方通過(guò)查閱死者的電腦和手機(jī)非凌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)荆针,“玉大人清焕,你說(shuō)我怎么就攤上這事〖婪福” “怎么了秸妥?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)沃粗。 經(jīng)常有香客問(wèn)我粥惧,道長(zhǎng),這世上最難降的妖魔是什么最盅? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任突雪,我火速辦了婚禮,結(jié)果婚禮上涡贱,老公的妹妹穿的比我還像新娘咏删。我一直安慰自己,他們只是感情好问词,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布督函。 她就那樣靜靜地躺著,像睡著了一般激挪。 火紅的嫁衣襯著肌膚如雪辰狡。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天垄分,我揣著相機(jī)與錄音宛篇,去河邊找鬼。 笑死薄湿,一個(gè)胖子當(dāng)著我的面吹牛叫倍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播豺瘤,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼吆倦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了炉奴?” 一聲冷哼從身側(cè)響起逼庞,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蛇更,失蹤者是張志新(化名)和其女友劉穎瞻赶,沒(méi)想到半個(gè)月后赛糟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡砸逊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年璧南,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片师逸。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡司倚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出篓像,到底是詐尸還是另有隱情动知,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布员辩,位于F島的核電站盒粮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏奠滑。R本人自食惡果不足惜丹皱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宋税。 院中可真熱鬧摊崭,春花似錦、人聲如沸杰赛。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)乏屯。三九已至阔墩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瓶珊,已是汗流浹背啸箫。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伞芹,地道東北人忘苛。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像唱较,于是被迫代替她去往敵國(guó)和親扎唾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

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