源代碼:
#導入庫
import requests
from bs4 import BeautifulSoup
import pandas as pd#爬蟲函數
def scrape_books():#1.基本網址連接base_url = "http://books.toscrape.com"#2.獲取基本網址response=requests.get(base_url)#3.檢查是否正常訪問if response.status_code !=200:print("無法訪問網站")return#創建解析器對象soup = BeautifulSoup(response.text, 'html.parser')books=[]# 提取所有圖書信息for book in soup.select('article.product_pod'):title = book.h3.a['title']price = book.select_one('p.price_color').textrating = book.select_one('p.star-rating')['class'][1]link = base_url + '/' + book.h3.a['href']books.append({'書名': title,'價格': price,'評分': rating,'鏈接': link})# 轉換為DataFrame并保存為CSVdf = pd.DataFrame(books)df.to_csv('books.csv', index=False)print(f"成功爬取 {len(books)} 本圖書信息")if __name__ == "__main__":scrape_books()
代碼詳解:
BeautifulSoup CSS選擇器詳細解析
這段代碼使用BeautifulSoup的CSS選擇器功能提取網頁數據,讓我一步步詳細解釋:
1. CSS選擇器基礎
soup.select()
?和?select_one()
select()
:返回所有匹配CSS選擇器的元素列表select_one()
:返回第一個匹配CSS選擇器的元素
選擇器語法:
選擇器 | 示例 | 說明 |
---|---|---|
標簽選擇器 | 'div' | 所有div元素 |
類選擇器 | '.product' | class="product"的元素 |
ID選擇器 | '#header' | id="header"的元素 |
屬性選擇器 | '[href]' | 所有帶href屬性的元素 |
組合選擇器 | 'div.product' | div標簽且class="product" |
后代選擇器 | 'div p' | div內部的所有p元素 |
2. 代碼逐行解析
循環獲取每本書
for book in soup.select('article.product_pod'):
soup.select('article.product_pod')
:選擇所有<article>
標簽且class包含product_pod
的元素返回一個元素列表,每個元素代表一個圖書容器
提取書名
title = book.h3.a['title']
book.h3.a
:從當前book元素中查找<h3>
標簽內的<a>
標簽['title']
:獲取該<a>
標簽的title屬性值相當于HTML:
<h3><a title="書名">...</a></h3>
提取價格
price = book.select_one('p.price_color').text
select_one('p.price_color')
:在當前book元素中查找第一個<p>
標簽且class包含price_color
.text
:獲取該元素的文本內容相當于HTML:
<p class="price_color">£18.80</p>
提取評分
rating = book.select_one('p.star-rating')['class'][1]
select_one('p.star-rating')
:查找第一個<p>
標簽且class包含star-rating
['class']
:獲取該元素的所有class屬性值(返回列表)[1]
:取列表的第二個元素(因為第一個總是"star-rating")相當于HTML:
<p class="star-rating Five">
?→ 提取"Five"
提取鏈接
link = base_url + '/' + book.h3.a['href']
book.h3.a['href']
:獲取<h3>
內<a>
標簽的href屬性值(相對路徑)base_url + '/' + ...
:拼接成完整URL
保存數據
books.append({'書名': title,'價格': price,'評分': rating,'鏈接': link
})
將提取的數據組成字典,添加到books列表
轉換為CSV
df = pd.DataFrame(books)
df.to_csv('books.csv', index=False)
pd.DataFrame(books)
:將字典列表轉換為pandas DataFrameto_csv()
:保存為CSV文件index=False
:不保存行索引
3. 對應HTML結構分析
假設目標網頁結構如下:
<article class="product_pod"><h3><a href="book1.html" title="Book Title 1">Book Title 1</a></h3><p class="price_color">£18.80</p><p class="star-rating Five">★★★★★</p>
</article><article class="product_pod"><h3><a href="book2.html" title="Book Title 2">Book Title 2</a></h3><p class="price_color">£22.50</p><p class="star-rating Four">★★★★☆</p>
</article>
Pandas 庫詳解:數據處理利器
import pandas as pd
?是 Python 數據分析中最常用的導入語句之一。Pandas 是一個強大的數據處理庫,特別適合處理表格數據(如 CSV、Excel)和時間序列數據。
為什么需要 Pandas?
替代 Excel 操作:可以處理 Excel 無法處理的大數據量
數據清洗工具:輕松處理缺失值、異常值
數據轉換能力:快速進行數據重塑、合并、分組
時間序列支持:專業的日期時間處理功能
高效性能:底層使用 NumPy 實現,運算速度快
Pandas 核心數據結構
1. Series - 一維數據
類似于帶索引的數組
import pandas as pd# 創建 Series
data = [1, 3, 5, 7]
s = pd.Series(data, index=['a', 'b', 'c', 'd'])
print(s)
"""
a 1
b 3
c 5
d 7
dtype: int64
"""
2. DataFrame - 二維表格
Pandas 的核心數據結構,類似 Excel 表格
# 創建 DataFrame
data = {'姓名': ['張三', '李四', '王五'],'年齡': [25, 30, 28],'城市': ['北京', '上海', '廣州']
}
df = pd.DataFrame(data)
print(df)
"""姓名 年齡 城市
0 張三 25 北京
1 李四 30 上海
2 王五 28 廣州
"""
在爬蟲項目中的應用
在爬蟲代碼中,我們使用 Pandas 將爬取的數據保存為 CSV 文件:
# 創建圖書數據列表
books = [{'書名': 'Python基礎', '價格': 59.9, '評分': '5星'},{'書名': '數據分析實戰', '價格': 79.9, '評分': '4.5星'},{'書名': '機器學習入門', '價格': 89.9, '評分': '4.8星'}
]# 將列表轉換為DataFrame
df = pd.DataFrame(books)# 保存為CSV文件
df.to_csv('books.csv', index=False, encoding='utf-8-sig')
關鍵參數解析:
index=False
:不保存行索引(0,1,2...)encoding='utf-8-sig'
:確保中文正常顯示其他常用參數:
sep=','
:分隔符(默認逗號)header=True
:包含列名(默認包含)
注:該代碼是本人自己所寫,可能不夠好,不夠簡便,歡迎大家指出我的不足之處。如果遇見看不懂的地方,可以在評論區打出來,進行討論,或者聯系我。上述內容全是我自己理解的,如果你有別的想法,或者認為我的理解不對,歡迎指出!!!如果可以,可以點一個免費的贊支持一下嗎?謝謝各位彥祖亦菲!!!!