源代码:

#导入库
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.pswp.cn/diannao/95102.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/95102.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/95102.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第七节 自然语言处理与Bert

自然语言处理与BERT模型&#xff1a;从基础到实践入门 自然语言处理&#xff08;NLP&#xff09;的核心目标之一是让计算机理解人类语言的语义和上下文。本文将从基础的字词表示出发&#xff0c;逐步解析传统模型的局限性、Self-attention的突破性思想&#xff0c;以及BERT如何…

攻击者瞄准加密技术的基础:智能合约

虽然利用许多智能合约中的安全漏洞已经成为网络攻击者的长期目标&#xff0c;但越来越多的安全公司开始关注使用欺诈性或混淆的智能合约从加密货币账户中窃取资金的骗局。 根据网络安全公司 SentinelOne 本周发布的分析报告&#xff0c;在最近一次引人注目的攻击中&#xff0c…

基于开源AI大模型、AI智能名片与S2B2C商城小程序的零售智能化升级路径研究

摘要&#xff1a;在零售业数字化转型浪潮中&#xff0c;人工智能技术正从“辅助工具”向“核心生产力”演进。本文聚焦开源AI大模型、AI智能名片与S2B2C商城小程序的协同应用&#xff0c;提出“数据感知-关系重构-生态协同”的三维创新框架。通过分析智能传感、动态画像与供应链…

机器学习 朴素贝叶斯

目录 一.什么是朴素贝叶斯 1.1 从 “概率” 到 “分类” 二.朴素贝叶斯的数学基础&#xff1a;贝叶斯定理 2.1 贝叶斯定理公式 2.2 从贝叶斯定理到朴素贝叶斯分类 2.3 “朴素” 的关键&#xff1a;特征独立性假设 三、朴素贝叶斯的三种常见类型 3.1 高斯朴素贝叶斯&…

A Logical Calculus of the Ideas Immanent in Nervous Activity(神经网络早期的M-P模型)

哈喽&#xff0c;各位朋友大家上午好&#xff01;今天我们要一起啃下这篇神经科学与逻辑学交叉领域的奠基之作——McCulloch和Pitts的《A Logical Calculus of the Ideas Immanent in Nervous Activity》。这篇论文篇幅不长&#xff0c;但每一个定理、每一个假设都像精密齿轮&a…

大语言模型提示工程与应用:提示工程-提升模型准确性与减少偏见的方法

语言模型可靠性优化 学习目标 在本课程中&#xff0c;我们将学习通过提示工程提升模型事实准确性、减少偏见的有效方法。 相关知识点 语言模型可靠性优化 学习内容 1 语言模型可靠性优化 1.1 事实准确性增强 LLM可能生成看似合理但实际虚构的内容。优化策略包括&#x…

遇到前端导出 Excel 文件出现乱码或文件损坏的问题

1. 检查后端返回的数据格式确认接口响应&#xff1a;确保后端返回的是二进制流&#xff08;如 ArrayBuffer&#xff09;或 Base64 编码的 Excel 文件&#xff0c;而非 JSON 字符串。用浏览器开发者工具&#xff08;Network 标签&#xff09;检查接口响应类型&#xff1a;正确的…

2025年Cloudflare WAF防护机制深度剖析:5秒盾绕过完全指南

2025年Cloudflare WAF防护机制深度剖析&#xff1a;5秒盾绕过完全指南 技术概述 Cloudflare作为全球领先的CDN和网络安全服务提供商&#xff0c;其WAF&#xff08;Web Application Firewall&#xff09;防护系统已经成为现代Web安全的标杆。特别是其标志性的"5秒盾"…

【Android调用相册、拍照、录像】等功能的封装

关于调用Android项目 关于Android中调用相机拍照、录像&#xff0c;调用相册选图等是比较繁琐的&#xff0c;为了减少代码冗余&#xff0c;肯定需要封装成工具类&#xff0c;最终使用大概如下&#xff0c;大部分代码使用Java编写&#xff0c;因为需要照顾到不适用kotlin的伸手…

Git 分支管理:从新开发分支迁移为主分支的完整指南

问题背景 我在使用 Git 进行开发时&#xff0c;由于原有的主分支遭到了污染&#xff0c;不得已在多方尝试之后&#xff0c;决定替换原有的主分支。创建一个新分支并完成了重要修改&#xff1a; 基于提交 0fcb6df0f5e8caa3d853bb1f43f23cfe6d269b18 创建了 new-development 分支…

nginx常见问题(四):端口无权限

当 Nginx 日志报错 bind() to 80 failed (13: Permission denied) 时&#xff0c;这通常是由于权限不足导致 Nginx 无法绑定到 80 端口&#xff08;该端口为系统特权端口&#xff09;。以下是详细的问题分析与解决方案&#xff1a;一、问题原因分析80 端口属于 系统特权端口&am…

【线性代数】线性方程组与矩阵——(3)线性方程组解的结构

上一节&#xff1a;【线性代数】线性方程组与矩阵——&#xff08;2&#xff09;矩阵与线性方程组的解 总目录&#xff1a;【线性代数】目录 文章目录9. 向量组的线性相关性与线性方程组解的结构9.1. 向量组及其线性组合9.2. 向量组的线性相关性9.3. 向量组的秩9.4. 线性方程组…

机器学习-----K-means算法介绍

一、为什么需要 K-Means&#xff1f;在监督学习中&#xff0c;我们总把数据写成 (x, y)&#xff0c;让模型学习 x → y 的映射。 但现实中很多数据根本没有标签 y&#xff0c;例如&#xff1a;啤酒&#xff1a;热量、钠含量、酒精度、价格用户&#xff1a;访问时长、点击次数、…

Spring Security自动处理/login请求,后端控制层没有 @PostMapping(“/login“) 这样的 Controller 方法

一&#xff1a;前言 &#xff08;1&#xff09;Spring Security概念&#xff1a; Spring Security 是属于 Spring 生态下一个功能强大且高度可定制的认证和授权框架&#xff0c;它不仅限于 Web 应用程序的安全性&#xff0c;也可以用于保护任何类型的应用程序。 &#xff08…

idea开发工具中git如何忽略编译文件build、gradle的文件?

idea开发工具中&#xff1a; git显示下面这个文件有变更&#xff1a; ~/Documents/wwwroot-dev/wlxl-backend/java/hyh-apis/hyh-apis-springboot/build/resources/main/mapping/AccountRealnameMapper.xml 我git的根路径是&#xff1a; ~/Documents/wwwroot-dev/wlxl-backend/…

状态机浅析

状态机是处理状态依赖型行为的高效工具&#xff0c;通过结构化建模状态转换&#xff0c;解决了传统条件判断的冗余和混乱问题。它在设备控制、流程管理、协议解析等场景中表现优异&#xff0c;核心优势在于逻辑清晰、可扩展性强和易于调试。 一、介绍 1. 概念 状态机&#x…

Windows 手动病毒排查指南:不依赖杀毒软件的系统安全防护

Windows 手动病毒排查指南&#xff1a;不依赖杀毒软件的系统安全防护 在数字时代&#xff0c;电脑病毒就像潜伏的"网络幽灵"&#xff0c;从窃取隐私的木马到消耗资源的蠕虫&#xff0c;时刻威胁着系统安全。当杀毒软件失效或遭遇新型威胁时&#xff0c;手动排查病毒便…

GPT-5 is here

GPT-5 is here https://openai.com/index/introducing-gpt-5/ — and it’s #1 across the board! #1 in Text, WebDev, and Vision Arena #1 in Hard Prompts, Coding, Math, Creativity, Long Queries, and more Tested under the codename “summit”, GPT-5 now holds the …

【华为机试】55. 跳跃游戏

文章目录55. 跳跃游戏题目描述示例 1&#xff1a;示例 2&#xff1a;提示&#xff1a;解题思路一、问题本质与建模二、方法总览与选择三、贪心算法的正确性&#xff08;直观解释 循环不变式&#xff09;四、反向贪心&#xff1a;等价但有启发的视角五、与动态规划的对比与误区…

RabbitMQ面试精讲 Day 18:内存与磁盘优化配置

【RabbitMQ面试精讲 Day 18】内存与磁盘优化配置 开篇&#xff1a;内存与磁盘优化的重要性 欢迎来到"RabbitMQ面试精讲"系列的第18天&#xff01;今天我们将深入探讨RabbitMQ的内存与磁盘优化配置&#xff0c;这是面试中经常被问及的高频主题&#xff0c;也是生产环…