Python 爬虫入门 Day 3 - 实现爬虫多页抓取与翻页逻辑

Python 第二阶段 - 爬虫入门

🎯 今日目标

  • 掌握网页分页的原理和定位“下一页”的链接
  • 能编写循环逻辑自动翻页抓取内容
  • 将多页抓取整合到爬虫系统中

📘 学习内容详解

  1. 🔁 网页分页逻辑介绍
    以 quotes.toscrape.com 为例:
  • 首页链接:https://quotes.toscrape.com/
  • 下一页链接:<li class="next"><a href="/page/2/">Next</a></li>

我们可以通过 BeautifulSoup 查找li.next > a['href'] 获取下一页地址,并拼接 URL。

  1. 🧪 核心思路伪代码

    while True:1. 请求当前页 URL2. 解析 HTML,提取所需内容3. 判断是否存在下一页链接- 如果有,拼接新 URL,继续循环- 如果没有,break 退出循环
    

💻 示例代码(多页抓取)

import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoindef scrape_all_quotes(start_url):quotes = []url = start_urlwhile url:print(f"正在抓取:{url}")res = requests.get(url)soup = BeautifulSoup(res.text, 'lxml')for quote_block in soup.find_all("div", class_="quote"):quote_text = quote_block.find("span", class_="text").text.strip()author = quote_block.find("small", class_="author").text.strip()tags = [tag.text for tag in quote_block.find_all("a", class_="tag")]quotes.append({"quote": quote_text,"author": author,"tags": tags})# 查找下一页next_link = soup.select_one("li.next > a")if next_link:next_href = next_link['href']url = urljoin(url, next_href)  # 拼接为完整URLelse:url = Nonereturn quotesif __name__ == "__main__":all_quotes = scrape_all_quotes("https://quotes.toscrape.com/")print(f"共抓取到 {len(all_quotes)} 条名言")# 示例输出前3条for quote in all_quotes[:3]:print(f"\n{quote['quote']}\n—— {quote['author']}|标签:{', '.join(quote['tags'])}")

🧠 今日练习任务

  • 修改已有爬虫,实现抓取所有页面的名言数据

  • 使用 len() 查看共抓取多少条数据

  • 额外挑战:将所有数据保存为 JSON 文件(使用 json.dump)

    练习代码:

    import requests
    from bs4 import BeautifulSoup
    from urllib.parse import urljoin
    import jsondef scrape_all_quotes(start_url):quotes = []url = start_urlwhile url:print(f"抓取页面:{url}")response = requests.get(url)soup = BeautifulSoup(response.text, "lxml")quote_blocks = soup.find_all("div", class_="quote")for block in quote_blocks:text = block.find("span", class_="text").text.strip()author = block.find("small", class_="author").text.strip()tags = [tag.text for tag in block.find_all("a", class_="tag")]quotes.append({"quote": text,"author": author,"tags": tags})# 找到下一页链接next_link = soup.select_one("li.next > a")if next_link:next_href = next_link['href']url = urljoin(url, next_href)else:url = Nonereturn quotesif __name__ == "__main__":start_url = "https://quotes.toscrape.com/"all_quotes = scrape_all_quotes(start_url)print(f"\n共抓取到 {len(all_quotes)} 条名言。\n")# 保存到 JSON 文件output_file = "quotes.json"with open(output_file, "w", encoding="utf-8") as f:json.dump(all_quotes, f, ensure_ascii=False, indent=2)print(f"数据已保存到文件:{output_file}")
    

    运行输出:

    正在抓取:https://quotes.toscrape.com/
    正在抓取:https://quotes.toscrape.com/page/2/
    正在抓取:https://quotes.toscrape.com/page/3/
    正在抓取:https://quotes.toscrape.com/page/4/
    正在抓取:https://quotes.toscrape.com/page/5/
    正在抓取:https://quotes.toscrape.com/page/6/
    正在抓取:https://quotes.toscrape.com/page/7/
    正在抓取:https://quotes.toscrape.com/page/8/
    正在抓取:https://quotes.toscrape.com/page/9/
    正在抓取:https://quotes.toscrape.com/page/10/
    共抓取到 100 条名言
    数据已保存到文件:quotes.json
    

    quotes.json文件输出:

    [{"quote": "“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”","author": "Albert Einstein","tags": ["change","deep-thoughts","thinking","world"]},{"quote": "“It is our choices, Harry, that show what we truly are, far more than our abilities.”","author": "J.K. Rowling","tags": ["abilities","choices"]},{"quote": "“There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”","author": "Albert Einstein","tags": ["inspirational","life","live","miracle","miracles"]},... # 此处省去95条数据{"quote": "“A person's a person, no matter how small.”","author": "Dr. Seuss","tags": ["inspirational"]},{"quote": "“... a mind needs books as a sword needs a whetstone, if it is to keep its edge.”","author": "George R.R. Martin","tags": ["books","mind"]}
    

📎 小技巧

  • urljoin(base_url, relative_path) 可以自动拼接绝对路径

  • 网站有时采用 JavaScript 动态分页 —— 这类网站需用 Selenium/Playwright(后续学习)

📝 今日总结

  • 学会了如何从网页中提取“下一页”链接
  • 掌握了自动翻页抓取逻辑的实现方式
  • 距离构建完整的数据采集工具更进一步

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/87061.shtml

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

相关文章

分布式定时任务系列12:XXL-job的任务触发为什么是死循环?

传送门 分布式定时任务系列1&#xff1a;XXL-job安装 分布式定时任务系列2&#xff1a;XXL-job使用 分布式定时任务系列3&#xff1a;任务执行引擎设计 分布式定时任务系列4&#xff1a;任务执行引擎设计续 分布式定时任务系列5&#xff1a;XXL-job中blockingQueue的应用 …

位运算详解之异或运算的奇妙操作

位运算详解之异或运算的奇妙操作 一、异或运算的本质与核心性质1.1 异或运算的定义与逻辑规则1.2 异或运算的核心代数性质&#xff08;1&#xff09;自反性&#xff1a;a ^ a 0&#xff08;2&#xff09;恒等性&#xff1a;a ^ 0 a&#xff08;3&#xff09;交换律&#xff1…

Element Plus 去除下拉菜单周黑边

问题&#xff1a; 如上图所示&#xff0c;当鼠标移入&#xff08;hover&#xff09;和点击时就会围绕一圈黑色边框&#xff0c;但通过本文的方案 100% 完美解决。 解决方案: :deep(:focus-visible) {outline: none; } 备用方案 :deep(.el-tooltip__trigger:focus-visible) …

React Native 项目实战 —— 记账本应用开发指南

React Native 项目实战 —— 记账本应用开发指南 项目概述&#xff1a;本文将指导您使用 React Native 开发一个简单的记账本应用&#xff0c;帮助用户记录收入和支出。核心内容&#xff1a;我们将分析功能模块、设计接口、划分组件结构、管理数据流、实现页面跳转&#xff0c…

从 PPO、DPO 到 GRPO:大语言模型策略优化算法解析

从 PPO、DPO 到 GRPO&#xff1a;大语言模型策略优化算法解析 背景与简介 大语言模型&#xff08;LLM&#xff09;的训练通常分为预训练和后训练两个阶段。预训练阶段&#xff0c;模型在海量文本上学习下一词预测的能力&#xff1b;后训练阶段&#xff0c;我们希望进一步对齐…

React中使用Day.js指南

文章目录 引言什么是Day.js&#xff1f;Day.js的核心特性 安装和基础配置安装Day.js基础导入和使用 在React中的基础使用1. 显示格式化日期2. 实时时钟组件 常用插件配置1. 相对时间插件2. 高级格式化插件3. 时区处理插件 实战案例&#xff1a;博客文章时间组件高级应用场景1. …

【系统设计【1】】系统设计面试方法论:从0到百万用户的需求到架构的推演

文章目录 一、系统设计面试的底层逻辑&#xff1a;从需求到架构的推演&#xff08;一&#xff09;需求澄清&#xff1a;界定问题边界&#xff08;二&#xff09;分层设计&#xff1a;从单节点到分布式的演进1. Web层&#xff1a;无状态化与负载均衡2. 数据层&#xff1a;数据库…

京津冀城市群13城市空间权重0-1矩阵

京津冀城市群13城市空间权重0-1矩阵 1、数据说明&#xff1a;京津冀13个城市&#xff1a;北京市、保定市、沧州市、承德市、邯郸市、衡水市、廊坊市、秦皇岛市、石家庄市、唐山市、邢台市、张家口市、天津市、 2、指标解释&#xff1a;空间权重矩阵是一种用于表征空间表达式的…

七大技术路线解析:自动驾驶如何被数据重新定义

自动驾驶技术从实验室的算法验证走向大规模量产应用&#xff0c;是一场充满挑战的征程。这段征程的核心驱动力&#xff0c;不仅是芯片和传感器的升级&#xff0c;更是一场关于数据的“喂养”竞赛——从简单的像素标注到多模态大模型的理解&#xff0c;数据需求的演变悄然推动着…

计网复习知识(16)传输层及其协议功能

目录 考研大纲 1.传输层概述 端口号 有连接/无连接传输 可靠/不可靠传输 2.UDP协议 2.1 udp数据报 2.2 udp检验 3.TCP协议 3.1 TCP协议的框架梳理 3.2 TCP报文段**** 3.3 三次握手与四次挥手 三次握手 四次挥手 3.4 可靠传输与流量控制 流量控制&#xff1a;滑动…

每天一个前端小知识 Day 1

语义化 HTML&#xff08;Semantic HTML&#xff09; 1. 什么是语义化 HTML&#xff1f; 语义化 HTML 指的是使用符合内容含义的标签&#xff0c;而不仅仅为了布局或样式。例如&#xff1a; <article>…</article> <nav>…</nav> <header>…&l…

在docker中部署mysql

部署 MySQL&#xff08;端口 9006&#xff09; 1. 创建数据目录 mkdir -p ~/qihuang/mysql/data2. 启动 MySQL 容器 docker run -d \--name mysql-qihuang \-p 9006:3306 \-v ~/qihuang/mysql/data:/var/lib/mysql \-e MYSQL_ROOT_PASSWORDroot \-e MYSQL_DATABASEqihuangdb…

JavaScript基础-事件对象

一、前言 在前端开发中&#xff0c;用户与页面的交互行为&#xff08;如点击按钮、输入文本、滚动页面等&#xff09;都会触发相应的事件。而这些事件发生时&#xff0c;浏览器会自动创建一个 事件对象&#xff08;Event Object&#xff09;&#xff0c;它包含了当前事件的所有…

蓝桥杯_染色_bfs_Java

临时抱抱佛脚&#xff0c;太浮躁了&#xff0c;蓝桥杯已经快1个半月没做题了。 本人比较菜&#xff0c;感觉这个时间节点也只能把暴力题给尽量多做做&#xff0c;找找做题手感&#xff0c;其他就纯凭运气了吧。T-T。 题目 问题描述 小蓝有一个 n 行 m 列的白色棋盘, 棋盘的每一…

MySQL 究极奥义·动态乾坤大挪移·无敌行列转换术

导入大SQL文件 [mysqld] # 大批量导入优化 bulk_insert_buffer_size1G max_allowed_packet1G innodb_autoextend_increment512M innodb_buffer_pool_size4G innodb_log_buffer_size4G innodb_log_file_size4G动态行列转换 DROP TABLE IF EXISTS tb_score;CREATE TABLE tb_sco…

Excel大厂自动化报表实战(互联网金融-数据分析周报制作中)

这是Excel大厂自动化报表实战第三期--互联网金融-数据分析周报制作中 数据资源已经与这篇博客捆绑&#xff0c;有需要者可以下载通过网盘分享的文件&#xff1a;2.4自动化报表-8月成交数据.xlsx&#xff0c;2.4自动化报表-8月获客数据.csv等2个文件 链接: https://pan.baidu.c…

langchain从入门到精通(七)——利用回调功能调试链应用 - 让过程更透明

1. Callback 功能介绍 Callback 是 LangChain 提供的回调机制&#xff0c;允许我们在 LLM 应用程序的各个阶段使用 hook &#xff08;钩子&#xff09;。钩子的含义也非常简单&#xff0c;我们把应用程序看成一个一个的处理逻辑&#xff0c;从开始到结束&#xff0c;钩子就是在…

如何使用Postman做接口自动化测试

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 本文适合已经掌握 Postman 基本用法的读者&#xff0c;即对接口相关概念有一定了解、已经会使用 Postman 进行模拟请求等基本操作。 工作环境与版本&#xff1a; …

ELK日志文件分析系统——E(Elasticsearch)

目录 基本概念 一、架构设计 二、核心原理 三、关键特性 四、应用意义 部署步骤 ‌一、环境准备‌ ‌二、安装 Elasticsearch‌ ‌三、关键配置&#xff08;elasticsearch.yml&#xff09;‌ ‌四、启动与验证‌ ‌五、集群扩展&#xff08;新增节点&#xff09;‌ …

融智学教育观及其数学公式体系凝练汇总

摘要&#xff1a;本文系统阐述了邹晓辉教授的融智学教育观&#xff0c;通过原创数学公式体系构建了人机协同教育模型。核心内容包括&#xff1a;认知本体论&#xff08;文明智慧当量方程&#xff09;、方法论&#xff08;七遍通训练算子&#xff09;、生态位控制论&#xff08;…