爬蟲(chóng)是Python的一個(gè)重要的應(yīng)用,使用Python爬蟲(chóng)我們可以輕松的從互聯(lián)網(wǎng)中抓取我們想要的數(shù)據(jù),**本文將基于爬取B站視頻熱搜榜單數(shù)據(jù)并存儲(chǔ)為例,詳細(xì)介紹Python爬蟲(chóng)的基本流程。**如果你還在入門(mén)爬蟲(chóng)階段或者不清楚爬蟲(chóng)的具體工作流程,那么應(yīng)該仔細(xì)閱讀本文!
第一步:嘗試請(qǐng)求
首先進(jìn)入b站首頁(yè),點(diǎn)擊排行榜并復(fù)制鏈接
https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3
現(xiàn)在啟動(dòng)Jupyter notebook
,并運(yùn)行以下代碼
import requests
url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
res = requests.get('url')
print(res.status_code)
#200
在上面的代碼中,我們完成了下面三件事
-
導(dǎo)入
requests
-
使用
get
方法構(gòu)造請(qǐng)求 -
使用
status_code
獲取網(wǎng)頁(yè)狀態(tài)碼
可以看到返回值是200
,表示服務(wù)器正常響應(yīng),這意味著我們可以繼續(xù)進(jìn)行。
第二步:解析頁(yè)面
在上一步我們通過(guò)requests向網(wǎng)站請(qǐng)求數(shù)據(jù)后,成功得到一個(gè)包含服務(wù)器資源的Response對(duì)象,現(xiàn)在我們可以使用.text
來(lái)查看其內(nèi)容
可以看到返回一個(gè)字符串,里面有我們需要的熱榜視頻數(shù)據(jù),但是直接從字符串中提取內(nèi)容是比較復(fù)雜且低效的,因此我們需要對(duì)其進(jìn)行解析,將字符串轉(zhuǎn)換為網(wǎng)頁(yè)結(jié)構(gòu)化數(shù)據(jù),這樣可以很方便地查找HTML標(biāo)簽以及其中的屬性和內(nèi)容。
在Python中解析網(wǎng)頁(yè)的方法有很多,可以使用正則表達(dá)式
,也可以使用BeautifulSoup
、pyquery
或lxml
,本文將基于BeautifulSoup進(jìn)行講解.
Beautiful Soup是一個(gè)可以從HTML或XML文件中提取數(shù)據(jù)的第三方庫(kù).安裝也很簡(jiǎn)單,使用pip install bs4
安裝即可,下面讓我們用一個(gè)簡(jiǎn)單的例子說(shuō)明它是怎樣工作的
from bs4 import BeautifulSoup
page = requests.get(url)
soup = BeautifulSoup(page.content, 'html.parser')
title = soup.title.text
print(title)
# 熱門(mén)視頻排行榜 - 嗶哩嗶哩 (゜-゜)つロ 干杯~-bilibili
在上面的代碼中,我們通過(guò)bs4中的BeautifulSoup類(lèi)將上一步得到的html格式字符串轉(zhuǎn)換為一個(gè)BeautifulSoup對(duì)象,注意在使用時(shí)需要制定一個(gè)解析器,這里使用的是html.parser
。
接著就可以獲取其中的某個(gè)結(jié)構(gòu)化元素及其屬性,比如使用soup.title.text
獲取頁(yè)面標(biāo)題,同樣可以使用soup.body
、soup.p
等獲取任意需要的元素。
第三步:提取內(nèi)容
在上面兩步中,我們分別使用requests向網(wǎng)頁(yè)請(qǐng)求數(shù)據(jù)并使用bs4解析頁(yè)面,現(xiàn)在來(lái)到最關(guān)鍵的步驟:如何從解析完的頁(yè)面中提取需要的內(nèi)容。
在Beautiful Soup中,我們可以使用find/find_all
來(lái)定位元素,但我更習(xí)慣使用CSS選擇器.select
,因?yàn)榭梢韵袷褂肅SS選擇元素一樣向下訪問(wèn)DOM樹(shù)。
現(xiàn)在我們用代碼講解如何從解析完的頁(yè)面中提取B站熱榜的數(shù)據(jù),首先我們需要找到存儲(chǔ)數(shù)據(jù)的標(biāo)簽,在榜單頁(yè)面按下F12并按照下圖指示找到
可以看到每一個(gè)視頻信息都被包在class="rank-item"
的li標(biāo)簽下,那么代碼就可以這樣寫(xiě)??
all_products = []
products = soup.select('li.rank-item')
for product in products:
rank = product.select('div.num')[0].text
name = product.select('div.info > a')[0].text.strip()
play = product.select('span.data-box')[0].text
comment = product.select('span.data-box')[1].text
up = product.select('span.data-box')[2].text
url = product.select('div.info > a')[0].attrs['href']
all_products.append({
"視頻排名":rank,
"視頻名": name,
"播放量": play,
"彈幕量": comment,
"up主": up,
"視頻鏈接": url
})
在上面的代碼中,我們先使用soup.select('li.rank-item')
,此時(shí)返回一個(gè)list包含每一個(gè)視頻信息,接著遍歷每一個(gè)視頻信息,依舊使用CSS選擇器來(lái)提取我們要的字段信息,并以字典的形式存儲(chǔ)在開(kāi)頭定義好的空列表中。
可以注意到我用了多種選擇方法提取去元素,這也是select方法的靈活之處,感興趣的讀者可以進(jìn)一步自行研究。
第四步:存儲(chǔ)數(shù)據(jù)
通過(guò)前面三步,我們成功的使用requests+bs4從網(wǎng)站中提取出需要的數(shù)據(jù),最后只需要將數(shù)據(jù)寫(xiě)入Excel中保存即可。
如果你對(duì)pandas不熟悉的話,可以使用csv
模塊寫(xiě)入,需要注意的是設(shè)置好編碼encoding='utf-8-sig'
,否則會(huì)出現(xiàn)中文亂碼的問(wèn)題
import csv
keys = all_products[0].keys()
with open('B站視頻熱榜TOP100.csv', 'w', newline='', encoding='utf-8-sig') as output_file:
dict_writer = csv.DictWriter(output_file, keys)
dict_writer.writeheader()
dict_writer.writerows(all_products)
如果你熟悉pandas的話,更是可以輕松將字典轉(zhuǎn)換為DataFrame,一行代碼即可完成
import pandas as pd
keys = all_products[0].keys()
pd.DataFrame(all_products,columns=keys).to_csv('B站視頻熱榜TOP100.csv', encoding='utf-8-sig')
小結(jié)
至此我們就成功使用Python將b站熱門(mén)視頻榜單數(shù)據(jù)存儲(chǔ)至本地,大多數(shù)基于requests的爬蟲(chóng)基本都按照上面四步進(jìn)行。
不過(guò)雖然看上去簡(jiǎn)單,但是在真實(shí)場(chǎng)景中每一步都沒(méi)有那么輕松,從請(qǐng)求數(shù)據(jù)開(kāi)始目標(biāo)網(wǎng)站就有多種形式的反爬、加密,到后面解析、提取甚至存儲(chǔ)數(shù)據(jù)都有很多需要進(jìn)一步探索、學(xué)習(xí)。
本文選擇B站視頻熱榜也正是因?yàn)樗銐蚝?jiǎn)單,希望通過(guò)這個(gè)案例讓大家明白爬蟲(chóng)的基本流程,最后附上完整代碼
import requests
from bs4 import BeautifulSoup
import csv
import pandas as pd
url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
page = requests.get(url)
soup = BeautifulSoup(page.content, 'html.parser')
all_products = []
products = soup.select('li.rank-item')
for product in products:
rank = product.select('div.num')[0].text
name = product.select('div.info > a')[0].text.strip()
play = product.select('span.data-box')[0].text
comment = product.select('span.data-box')[1].text
up = product.select('span.data-box')[2].text
url = product.select('div.info > a')[0].attrs['href']
all_products.append({
"視頻排名":rank,
"視頻名": name,
"播放量": play,
"彈幕量": comment,
"up主": up,
"視頻鏈接": url
})
keys = all_products[0].keys()
with open('B站視頻熱榜TOP100.csv', 'w', newline='', encoding='utf-8-sig') as output_file:
dict_writer = csv.DictWriter(output_file, keys)
dict_writer.writeheader()
dict_writer.writerows(all_products)
### 使用pandas寫(xiě)入數(shù)據(jù)
pd.DataFrame(all_products,columns=keys).to_csv('B站視頻熱榜TOP100.csv', encoding='utf-8-sig')
end
目前在編程語(yǔ)言兵器排行榜上,最火的兩門(mén)語(yǔ)言就是Python和Java。二者各有千秋Java比較好找工作,Python使用面非常廣,而且簡(jiǎn)單易學(xué)可以干很多事情,很多同學(xué)兩門(mén)都在學(xué)。于是小編整理了資料送給大家,幫你加油打call。
準(zhǔn)備了一門(mén)非常系統(tǒng)的Python課程,除了為你提供一條清晰、無(wú)痛的學(xué)習(xí)路徑,我們甄選了最實(shí)用的學(xué)習(xí)資源以及龐大的主流爬蟲(chóng)案例庫(kù)。短時(shí)間的學(xué)習(xí),你就能夠很好地掌握爬蟲(chóng)這個(gè)技能,獲取你想得到的數(shù)據(jù),需要的朋友可以掃描文末二維碼即可獲取。
01 專(zhuān)為0基礎(chǔ)設(shè)置,小白也能輕松學(xué)會(huì)
我們把Python的所有知識(shí)點(diǎn),都穿插在了漫畫(huà)里面。
在Python小課中,你可以通過(guò)漫畫(huà)的方式學(xué)到知識(shí)點(diǎn),難懂的專(zhuān)業(yè)知識(shí)瞬間變得有趣易懂。
你就像漫畫(huà)的主人公一樣,穿越在劇情中,通關(guān)過(guò)坎,不知不覺(jué)完成知識(shí)的學(xué)習(xí)。
02 無(wú)需自己下載安裝包,提供詳細(xì)安裝教程
03 規(guī)劃詳細(xì)學(xué)習(xí)路線,提供學(xué)習(xí)視頻
04 提供實(shí)戰(zhàn)資料,更好鞏固知識(shí)
05 提供面試資料以及副業(yè)資料,便于更好就業(yè)
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-766938.html
這份完整版的Python全套學(xué)習(xí)資料已經(jīng)上傳CSDN,朋友們?nèi)绻枰部梢話呙柘路絚sdn官方二維碼或者點(diǎn)擊主頁(yè)和文章下方的微信卡片獲取領(lǐng)取方式,【保證100%免費(fèi)】文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-766938.html
到了這里,關(guān)于『爬蟲(chóng)四步走』手把手教你使用Python抓取并存儲(chǔ)網(wǎng)頁(yè)數(shù)據(jù)!的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!