使用BeautifulSoup和Pandas進(jìn)行網(wǎng)頁數(shù)據(jù)抓取與清洗處理
在數(shù)據(jù)分析和機(jī)器學(xué)習(xí)的項(xiàng)目中,數(shù)據(jù)的獲取、清洗和處理是非常關(guān)鍵的步驟。今天,我們將通過一個(gè)實(shí)戰(zhàn)案例,演示如何利用Python中的Beautiful Soup庫進(jìn)行網(wǎng)頁數(shù)據(jù)抓取,并使用Pandas庫進(jìn)行數(shù)據(jù)清洗和處理。這個(gè)案例不僅適合初學(xué)者,也能幫助有一定經(jīng)驗(yàn)的朋友快速掌握這兩個(gè)強(qiáng)大的工具。
一、準(zhǔn)備工作
在開始之前,請(qǐng)確保你的Python環(huán)境中已經(jīng)安裝了requests、beautifulsoup4和pandas庫。你可以通過以下命令安裝它們:
pip install requests beautifulsoup4 pandas
此外,我們需要抓取一個(gè)網(wǎng)頁的數(shù)據(jù)作為示例。為了簡單起見,我們選擇了一個(gè)公開的新聞網(wǎng)站頁面。
二、抓取網(wǎng)頁數(shù)據(jù)
首先,我們需要使用requests庫獲取網(wǎng)頁的HTML內(nèi)容。然后,使用Beautiful Soup解析HTML,并提取我們感興趣的數(shù)據(jù)。
import requests from bs4 import BeautifulSoup # 目標(biāo)網(wǎng)頁URL url = 'https://example.com/news' # 替換為實(shí)際的URL # 發(fā)送HTTP請(qǐng)求獲取網(wǎng)頁內(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)容。通過檢查網(wǎng)頁的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. 刪除缺失值或無效數(shù)據(jù)(假設(shè)空標(biāo)題或空內(nèi)容的數(shù)據(jù)無效) 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ān)鍵詞的新聞) keyword = '疫情' filtered_df = df[df['content'].str.contains(keyword, na=False, case=False)] # 打印過濾后的數(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)頁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)頁URL(請(qǐng)?zhí)鎿Q為實(shí)際的URL) url = 'https://example.com/news' # 發(fā)送HTTP請(qǐng)求獲取網(wǎng)頁內(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)鍵詞過濾新聞) 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') # 打印過濾后的數(shù)據(jù)查看 print(filtered_df.head())
七、總結(jié)
通過本文,我們學(xué)會(huì)了如何使用Beautiful Soup進(jìn)行網(wǎng)頁數(shù)據(jù)抓取,并使用Pandas進(jìn)行數(shù)據(jù)清洗和處理。這兩個(gè)庫的結(jié)合使用可以大大提高我們處理網(wǎng)頁數(shù)據(jù)的效率。在實(shí)際項(xiàng)目中,你可能需要根據(jù)具體的網(wǎng)頁結(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)頁數(shù)據(jù)抓取與清洗處理的文章就介紹到這了,更多相關(guān)BeautifulSoup Pandas數(shù)據(jù)抓取與清洗內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python使用BeautifulSoup和Scrapy抓取網(wǎng)頁數(shù)據(jù)的具體教程
- Python使用BeautifulSoup抓取和解析網(wǎng)頁數(shù)據(jù)的操作方法
- 從零開始學(xué)習(xí)Python與BeautifulSoup網(wǎng)頁數(shù)據(jù)抓取
- Python使用BeautifulSoup爬取網(wǎng)頁數(shù)據(jù)的操作步驟
- Python爬蟲之使用BeautifulSoup和Requests抓取網(wǎng)頁數(shù)據(jù)
- Python?BeautifulSoup4實(shí)現(xiàn)數(shù)據(jù)解析與提取
- Python數(shù)據(jù)解析之BeautifulSoup4的用法詳解
相關(guān)文章
Windows 8.1 64bit下搭建 Scrapy 0.22 環(huán)境
這篇文章主要介紹了Windows 8.1 64bit下搭建 Scrapy 0.22 環(huán)境,需要的朋友可以參考下2018-11-11深入解析Python中BeautifulSoup4的基礎(chǔ)知識(shí)與實(shí)戰(zhàn)應(yīng)用
BeautifulSoup4正是一款功能強(qiáng)大的解析器,能夠輕松解析HTML和XML文檔,本文將介紹BeautifulSoup4的基礎(chǔ)知識(shí),并通過實(shí)際代碼示例進(jìn)行演示,感興趣的可以了解下2024-02-02python中join與os.path.join()函數(shù)實(shí)例詳解
os.path.join()函數(shù)用于路徑拼接文件路徑,下面這篇文章主要給大家介紹了關(guān)于python中join與os.path.join()函數(shù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03將tensorflow的ckpt模型存儲(chǔ)為npy的實(shí)例
今天小編就為大家分享一篇將tensorflow的ckpt模型存儲(chǔ)為npy的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07Django 忘記管理員或忘記管理員密碼 重設(shè)登錄密碼的方法
今天小編就為大家分享一篇Django 忘記管理員或忘記管理員密碼 重設(shè)登錄密碼的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05Python結(jié)合OpenCV和Pyzbar實(shí)現(xiàn)實(shí)時(shí)攝像頭識(shí)別二維碼
這篇文章主要為大家詳細(xì)介紹了如何使用Python編程語言結(jié)合OpenCV和Pyzbar庫來實(shí)時(shí)攝像頭識(shí)別二維碼,文中的示例代碼講解詳細(xì),需要的可以參考下2024-01-01python讀取mnist數(shù)據(jù)集方法案例詳解
這篇文章主要介紹了python讀取mnist數(shù)據(jù)集方法案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09pyhton列表轉(zhuǎn)換為數(shù)組的實(shí)例
下面小編就為大家分享一篇pyhton列表轉(zhuǎn)換為數(shù)組的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04