日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

『爬虫四步走』手把手教你使用Python抓取并存储网页数据!

發(fā)布時(shí)間:2024/9/15 python 104 豆豆
生活随笔 收集整理的這篇文章主要介紹了 『爬虫四步走』手把手教你使用Python抓取并存储网页数据! 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

爬蟲是Python的一個(gè)重要的應(yīng)用,使用Python爬蟲我們可以輕松的從互聯(lián)網(wǎng)中抓取我們想要的數(shù)據(jù),本文將基于爬取B站視頻熱搜榜單數(shù)據(jù)并存儲(chǔ)為例,詳細(xì)介紹Python爬蟲的基本流程。如果你還在入門爬蟲階段或者不清楚爬蟲的具體工作流程,那么應(yīng)該仔細(xì)閱讀本文!

? 第一步:嘗試請求

首先進(jìn)入b站首頁,點(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?requestsurl?=?'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)造請求

  • 使用status_code獲取網(wǎng)頁狀態(tài)碼

可以看到返回值是200,表示服務(wù)器正常響應(yīng),這意味著我們可以繼續(xù)進(jìn)行。

? 第二步:解析頁面

在上一步我們通過requests向網(wǎng)站請求數(shù)據(jù)后,成功得到一個(gè)包含服務(wù)器資源的Response對象,現(xiàn)在我們可以使用.text來查看其內(nèi)容

可以看到返回一個(gè)字符串,里面有我們需要的熱榜視頻數(shù)據(jù),但是直接從字符串中提取內(nèi)容是比較復(fù)雜且低效的,因此我們需要對其進(jìn)行解析,將字符串轉(zhuǎn)換為網(wǎng)頁結(jié)構(gòu)化數(shù)據(jù),這樣可以很方便地查找HTML標(biāo)簽以及其中的屬性和內(nèi)容。

在Python中解析網(wǎng)頁的方法有很多,可以使用正則表達(dá)式,也可以使用BeautifulSoup、pyquery或lxml,本文將基于BeautifulSoup進(jìn)行講解.

Beautiful Soup是一個(gè)可以從HTML或XML文件中提取數(shù)據(jù)的第三方庫.安裝也很簡單,使用pip install bs4安裝即可,下面讓我們用一個(gè)簡單的例子說明它是怎樣工作的

from?bs4?import?BeautifulSouppage?=?requests.get(url) soup?=?BeautifulSoup(page.content,?'html.parser') title?=?soup.title.text? print(title) #?熱門視頻排行榜?-?嗶哩嗶哩?(゜-゜)つロ?干杯~-bilibili

在上面的代碼中,我們通過bs4中的BeautifulSoup類將上一步得到的html格式字符串轉(zhuǎn)換為一個(gè)BeautifulSoup對象,注意在使用時(shí)需要制定一個(gè)解析器,這里使用的是html.parser。

接著就可以獲取其中的某個(gè)結(jié)構(gòu)化元素及其屬性,比如使用soup.title.text獲取頁面標(biāo)題,同樣可以使用soup.body、soup.p等獲取任意需要的元素。

? 第三步:提取內(nèi)容

在上面兩步中,我們分別使用requests向網(wǎng)頁請求數(shù)據(jù)并使用bs4解析頁面,現(xiàn)在來到最關(guān)鍵的步驟:如何從解析完的頁面中提取需要的內(nèi)容

Beautiful Soup中,我們可以使用find/find_all來定位元素,但我更習(xí)慣使用CSS選擇器.select,因?yàn)榭梢韵袷褂肅SS選擇元素一樣向下訪問DOM樹。

現(xiàn)在我們用代碼講解如何從解析完的頁面中提取B站熱榜的數(shù)據(jù),首先我們需要找到存儲(chǔ)數(shù)據(jù)的標(biāo)簽,在榜單頁面按下F12并按照下圖指示找到

可以看到每一個(gè)視頻信息都被包在class="rank-item"的li標(biāo)簽下,那么代碼就可以這樣寫????

all_products?=?[]products?=?soup.select('li.rank-item') for?product?in?products:rank?=?product.select('div.num')[0].textname?=?product.select('div.info?>?a')[0].text.strip()play?=?product.select('span.data-box')[0].textcomment?=?product.select('span.data-box')[1].textup?=?product.select('span.data-box')[2].texturl?=?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選擇器來提取我們要的字段信息,并以字典的形式存儲(chǔ)在開頭定義好的空列表中。

可以注意到我用了多種選擇方法提取去元素,這也是select方法的靈活之處,感興趣的讀者可以進(jìn)一步自行研究。

? 第四步:存儲(chǔ)數(shù)據(jù)

通過前面三步,我們成功的使用requests+bs4從網(wǎng)站中提取出需要的數(shù)據(jù),最后只需要將數(shù)據(jù)寫入Excel中保存即可。

如果你對pandas不熟悉的話,可以使用csv模塊寫入,需要注意的是設(shè)置好編碼encoding='utf-8-sig',否則會(huì)出現(xià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站熱門視頻榜單數(shù)據(jù)存儲(chǔ)至本地,大多數(shù)基于requests的爬蟲基本都按照上面四步進(jìn)行。

不過雖然看上去簡單,但是在真實(shí)場景中每一步都沒有那么輕松,從請求數(shù)據(jù)開始目標(biāo)網(wǎng)站就有多種形式的反爬、加密,到后面解析、提取甚至存儲(chǔ)數(shù)據(jù)都有很多需要進(jìn)一步探索、學(xué)習(xí)。

本文選擇B站視頻熱榜也正是因?yàn)樗銐蚝唵?#xff0c;希望通過這個(gè)案例讓大家明白爬蟲的基本流程,最后附上完整代碼

import?requests from?bs4?import?BeautifulSoup import?csv import?pandas?as?pdurl?=?'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].textname?=?product.select('div.info?>?a')[0].text.strip()play?=?product.select('span.data-box')[0].textcomment?=?product.select('span.data-box')[1].textup?=?product.select('span.data-box')[2].texturl?=?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寫入數(shù)據(jù) pd.DataFrame(all_products,columns=keys).to_csv('B站視頻熱榜TOP100.csv',?encoding='utf-8-sig') 由于微信平臺算法改版,公號內(nèi)容將不再以時(shí)間排序展示,如果大家想第一時(shí)間看到我們的推送,強(qiáng)烈建議星標(biāo)我們和給我們多點(diǎn)點(diǎn)【在看】。星標(biāo)具體步驟為:(1)點(diǎn)擊頁面最上方“小詹學(xué)Python”,進(jìn)入公眾號主頁。 (2)點(diǎn)擊右上角的小點(diǎn)點(diǎn),在彈出頁面點(diǎn)擊“設(shè)為星標(biāo)”,就可以啦。 感謝支持,比心。

總結(jié)

以上是生活随笔為你收集整理的『爬虫四步走』手把手教你使用Python抓取并存储网页数据!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。