当前位置: 首页 > news >正文

(Python)爬虫进阶(Python爬虫教程)(CSS选择器)

源代码:

#导入库
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 DataFrame

  • to_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?

  1. 替代 Excel 操作:可以处理 Excel 无法处理的大数据量

  2. 数据清洗工具:轻松处理缺失值、异常值

  3. 数据转换能力:快速进行数据重塑、合并、分组

  4. 时间序列支持:专业的日期时间处理功能

  5. 高效性能:底层使用 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:包含列名(默认包含)

注:该代码是本人自己所写,可能不够好,不够简便,欢迎大家指出我的不足之处。如果遇见看不懂的地方,可以在评论区打出来,进行讨论,或者联系我。上述内容全是我自己理解的,如果你有别的想法,或者认为我的理解不对,欢迎指出!!!如果可以,可以点一个免费的赞支持一下吗?谢谢各位彦祖亦菲!!!!

http://www.xdnf.cn/news/1272943.html

相关文章:

  • stm32没有CMSIS文件
  • 【精彩回顾·成都】成都 User Group×柴火创客空间:开源硬件驱动 AI 与云的创新实践!
  • vue和react和uniapp的状态管理分别是什么,并且介绍和怎么使用
  • Day38--动态规划--322. 零钱兑换,279. 完全平方数,139. 单词拆分,56. 携带矿石资源(卡码网),背包问题总结
  • 如何理解SA_RESTART”被信号中断的系统调用自动重启“?
  • Vue3 组件化开发
  • 人工智能技术发展历史演变
  • Filter,Interceptor拦截器-登录校验
  • 关于城市农村创业的一点构想
  • RecyclerView 缓存机制
  • 堆----3.数据流的中位数
  • Slab 算法浅析
  • HTML全景效果实现
  • 【Python 语法糖小火锅 · 第 2 涮】
  • 容器技术基础与实践:从镜像管理到自动运行配置全攻略
  • 【数据分享】各省农业土地流转率(2010-2023)
  • 【Python 语法糖小火锅 · 第 4 涮】
  • 【Python 语法糖小火锅 · 第 3 涮】
  • 【unitrix数间混合计算】2.9 小数部分特征(t_non_zero_bin_frac.rs)
  • 【Canvas与旗帜】圆角蓝底大黄白星十一红白带旗
  • UE破碎Chaos分配模型内部面材质
  • CentOS7编译安装GCC
  • 【Python 高频 API 速学 ④】
  • Spring学习笔记:Spring AOP入门以及基于Spring AOP配置的深入学习与使用
  • 嵌入式软件工程师笔试题(二)
  • 腾讯COS云存储入门
  • 原创邮件合并Python工具使用说明(附源码)
  • 安装NodeJS和TypeScript简要指南
  • 东方心绣脸启幕26周年盛典:以匠心锚定百年基业
  • 百度网盘自动启动如何关闭,关闭智能看图