使用BeautifulSoup和Pandas進(jìn)行網(wǎng)頁(yè)數(shù)據(jù)抓取與清洗處理
在數(shù)據(jù)分析和機(jī)器學(xué)習(xí)的項(xiàng)目中,數(shù)據(jù)的獲取、清洗和處理是非常關(guān)鍵的步驟。今天,我們將通過(guò)一個(gè)實(shí)戰(zhàn)案例,演示如何利用Python中的Beautiful Soup庫(kù)進(jìn)行網(wǎng)頁(yè)數(shù)據(jù)抓取,并使用Pandas庫(kù)進(jìn)行數(shù)據(jù)清洗和處理。這個(gè)案例不僅適合初學(xué)者,也能幫助有一定經(jīng)驗(yàn)的朋友快速掌握這兩個(gè)強(qiáng)大的工具。
一、準(zhǔn)備工作
在開(kāi)始之前,請(qǐng)確保你的Python環(huán)境中已經(jīng)安裝了requests、beautifulsoup4和pandas庫(kù)。你可以通過(guò)以下命令安裝它們:
pip install requests beautifulsoup4 pandas
此外,我們需要抓取一個(gè)網(wǎng)頁(yè)的數(shù)據(jù)作為示例。為了簡(jiǎn)單起見(jiàn),我們選擇了一個(gè)公開(kāi)的新聞網(wǎng)站頁(yè)面。
二、抓取網(wǎng)頁(yè)數(shù)據(jù)
首先,我們需要使用requests庫(kù)獲取網(wǎng)頁(yè)的HTML內(nèi)容。然后,使用Beautiful Soup解析HTML,并提取我們感興趣的數(shù)據(jù)。
import requests from bs4 import BeautifulSoup # 目標(biāo)網(wǎng)頁(yè)URL url = 'https://example.com/news' # 替換為實(shí)際的URL # 發(fā)送HTTP請(qǐng)求獲取網(wǎng)頁(yè)內(nèi)容 response = requests.get(url) response.raise_for_status() # 檢查請(qǐng)求是否成功 # 使用Beautiful Soup解析HTML soup = BeautifulSoup(response.text, 'html.parser')
假設(shè)我們要提取新聞標(biāo)題、發(fā)布時(shí)間和正文內(nèi)容。通過(guò)檢查網(wǎng)頁(yè)的HTML結(jié)構(gòu),我們發(fā)現(xiàn)這些信息都包含在特定的HTML標(biāo)簽中。
# 提取新聞標(biāo)題、發(fā)布時(shí)間和正文內(nèi)容
articles = []
for article in soup.select('.news-article'): # 假設(shè)新聞文章都有class="news-article"
title = article.select_one('h2.title').text.strip()
publish_time = article.select_one('.publish-time').text.strip()
content = article.select_one('.content').text.strip()
articles.append({
'title': title,
'publish_time': publish_time,
'content': content
})
三、數(shù)據(jù)清洗
抓取到的數(shù)據(jù)通常包含一些不需要的信息,比如多余的空格、HTML標(biāo)簽殘留、特殊字符等。我們需要對(duì)這些數(shù)據(jù)進(jìn)行清洗。
import pandas as pd
# 將數(shù)據(jù)轉(zhuǎn)換為DataFrame
df = pd.DataFrame(articles)
# 打印前幾行數(shù)據(jù)查看
print(df.head())
# 數(shù)據(jù)清洗步驟
# 1. 去除字符串前后的空格(已在提取時(shí)處理)
# 2. 替換特殊字符(例如換行符為空格)
df['content'] = df['content'].str.replace('\n', ' ')
# 3. 刪除缺失值或無(wú)效數(shù)據(jù)(假設(shè)空標(biāo)題或空內(nèi)容的數(shù)據(jù)無(wú)效)
df = df.dropna(subset=['title', 'content'])
# 4. 統(tǒng)一時(shí)間格式(假設(shè)發(fā)布時(shí)間為"YYYY-MM-DD HH:MM:SS"格式)
# 這里我們假設(shè)發(fā)布時(shí)間已經(jīng)是字符串格式,且格式統(tǒng)一,如果需要轉(zhuǎn)換格式,可以使用pd.to_datetime()
# df['publish_time'] = pd.to_datetime(df['publish_time'], format='%Y-%m-%d %H:%M:%S')
# 打印清洗后的數(shù)據(jù)查看
print(df.head())
四、數(shù)據(jù)處理
數(shù)據(jù)清洗后,我們可能還需要進(jìn)行一些額外的處理,比如數(shù)據(jù)轉(zhuǎn)換、數(shù)據(jù)合并、數(shù)據(jù)分組等。
# 數(shù)據(jù)處理步驟 # 1. 提取發(fā)布日期的日期部分(如果需要) # df['publish_date'] = df['publish_time'].dt.date # 2. 統(tǒng)計(jì)每個(gè)發(fā)布日期的新聞數(shù)量(如果需要) # daily_counts = df['publish_date'].value_counts().reset_index() # daily_counts.columns = ['publish_date', 'count'] # print(daily_counts) # 3. 根據(jù)關(guān)鍵詞過(guò)濾新聞(例如只保留包含"疫情"關(guān)鍵詞的新聞) keyword = '疫情' filtered_df = df[df['content'].str.contains(keyword, na=False, case=False)] # 打印過(guò)濾后的數(shù)據(jù)查看 print(filtered_df.head())
五、保存數(shù)據(jù)
處理完數(shù)據(jù)后,我們可能需要將其保存到文件中,以便后續(xù)使用。Pandas提供了多種保存數(shù)據(jù)的方法,比如保存為CSV文件、Excel文件等。
# 保存數(shù)據(jù)為CSV文件 csv_file_path = 'cleaned_news_data.csv' df.to_csv(csv_file_path, index=False, encoding='utf-8-sig') # 保存數(shù)據(jù)為Excel文件 excel_file_path = 'cleaned_news_data.xlsx' df.to_excel(excel_file_path, index=False, engine='openpyxl')
六、完整代碼示例
為了方便大家理解和運(yùn)行,以下是完整的代碼示例。請(qǐng)確保將url變量替換為實(shí)際的網(wǎng)頁(yè)URL,并根據(jù)實(shí)際的HTML結(jié)構(gòu)調(diào)整Beautiful Soup的選擇器。
import requests
from bs4 import BeautifulSoup
import pandas as pd
# 目標(biāo)網(wǎng)頁(yè)URL(請(qǐng)?zhí)鎿Q為實(shí)際的URL)
url = 'https://example.com/news'
# 發(fā)送HTTP請(qǐng)求獲取網(wǎng)頁(yè)內(nèi)容
response = requests.get(url)
response.raise_for_status()
# 使用Beautiful Soup解析HTML
soup = BeautifulSoup(response.text, 'html.parser')
# 提取新聞標(biāo)題、發(fā)布時(shí)間和正文內(nèi)容
articles = []
for article in soup.select('.news-article'): # 假設(shè)新聞文章都有class="news-article"
title = article.select_one('h2.title').text.strip()
publish_time = article.select_one('.publish-time').text.strip()
content = article.select_one('.content').text.strip()
articles.append({
'title': title,
'publish_time': publish_time,
'content': content
})
# 將數(shù)據(jù)轉(zhuǎn)換為DataFrame
df = pd.DataFrame(articles)
# 數(shù)據(jù)清洗步驟
df['content'] = df['content'].str.replace('\n', ' ')
df = df.dropna(subset=['title', 'content'])
# 數(shù)據(jù)處理步驟(示例:根據(jù)關(guān)鍵詞過(guò)濾新聞)
keyword = '疫情'
filtered_df = df[df['content'].str.contains(keyword, na=False, case=False)]
# 保存數(shù)據(jù)為CSV文件和Excel文件
csv_file_path = 'cleaned_news_data.csv'
excel_file_path = 'cleaned_news_data.xlsx'
df.to_csv(csv_file_path, index=False, encoding='utf-8-sig')
df.to_excel(excel_file_path, index=False, engine='openpyxl')
# 打印過(guò)濾后的數(shù)據(jù)查看
print(filtered_df.head())
七、總結(jié)
通過(guò)本文,我們學(xué)會(huì)了如何使用Beautiful Soup進(jìn)行網(wǎng)頁(yè)數(shù)據(jù)抓取,并使用Pandas進(jìn)行數(shù)據(jù)清洗和處理。這兩個(gè)庫(kù)的結(jié)合使用可以大大提高我們處理網(wǎng)頁(yè)數(shù)據(jù)的效率。在實(shí)際項(xiàng)目中,你可能需要根據(jù)具體的網(wǎng)頁(yè)結(jié)構(gòu)和數(shù)據(jù)需求調(diào)整代碼。希望這個(gè)實(shí)戰(zhàn)案例能幫助你更好地掌握這兩個(gè)工具,并在你的數(shù)據(jù)分析和機(jī)器學(xué)習(xí)項(xiàng)目中發(fā)揮它們的作用。
到此這篇關(guān)于使用BeautifulSoup和Pandas進(jìn)行網(wǎng)頁(yè)數(shù)據(jù)抓取與清洗處理的文章就介紹到這了,更多相關(guān)BeautifulSoup Pandas數(shù)據(jù)抓取與清洗內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python使用BeautifulSoup和Scrapy抓取網(wǎng)頁(yè)數(shù)據(jù)的具體教程
- Python使用BeautifulSoup抓取和解析網(wǎng)頁(yè)數(shù)據(jù)的操作方法
- 從零開(kāi)始學(xué)習(xí)Python與BeautifulSoup網(wǎng)頁(yè)數(shù)據(jù)抓取
- Python使用BeautifulSoup爬取網(wǎng)頁(yè)數(shù)據(jù)的操作步驟
- Python爬蟲(chóng)之使用BeautifulSoup和Requests抓取網(wǎng)頁(yè)數(shù)據(jù)
- Python?BeautifulSoup4實(shí)現(xiàn)數(shù)據(jù)解析與提取
- Python數(shù)據(jù)解析之BeautifulSoup4的用法詳解
相關(guān)文章
python可擴(kuò)展的Blender 3D插件開(kāi)發(fā)匯總
這篇文章主要為大家介紹了python可擴(kuò)展的Blender 3D插件開(kāi)發(fā)匯總,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
Python 數(shù)據(jù)結(jié)構(gòu)之十大經(jīng)典排序算法一文通關(guān)
排序算法可以分為內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部的排序記錄,在排序過(guò)程中需要訪問(wèn)外存2021-10-10
用實(shí)例說(shuō)明python的*args和**kwargs用法
python的*args和**kwargs如何用,看了下面的例子你就清楚了。2013-11-11
python pandas輕松通過(guò)特定列的值多條件去篩選數(shù)據(jù)及contains方法的使用
這篇文章主要介紹了python pandas輕松通過(guò)特定列的值多條件去篩選數(shù)據(jù)及contains方法的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02
python兩個(gè)_多個(gè)字典合并相加的實(shí)例代碼
這篇文章主要介紹了python兩個(gè)_多個(gè)字典合并相加,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12
python 實(shí)現(xiàn)矩陣上下/左右翻轉(zhuǎn),轉(zhuǎn)置的示例
今天小編就為大家分享一篇python 實(shí)現(xiàn)矩陣上下/左右翻轉(zhuǎn),轉(zhuǎn)置的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01

