源代码:
#导入库
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').text
rating = book.select_one('p.star-rating')['class'][1]
link = base_url + '/' + book.h3.a['href']
books.append({
'书名': title,
'价格': price,
'评分': rating,
'链接': link
})
# 转换为DataFrame并保存为CSV
df = 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
:包含列名(默认包含)
注:该代码是本人自己所写,可能不够好,不够简便,欢迎大家指出我的不足之处。如果遇见看不懂的地方,可以在评论区打出来,进行讨论,或者联系我。上述内容全是我自己理解的,如果你有别的想法,或者认为我的理解不对,欢迎指出!!!如果可以,可以点一个免费的赞支持一下吗?谢谢各位彦祖亦菲!!!!