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

使用 Selenium 和 Python 爬取腾讯新闻:从基础到实践

使用 Selenium 和 Python 爬取腾讯新闻:从基础到实践

在这篇博客中,我们将介绍如何利用 Selenium 和 Python 爬取腾讯新闻的内容,并将结果保存到 CSV 文件中。本教程包含以下内容:

  1. 项目简介
  2. 依赖安装
  3. 实现功能的代码
  4. 实现中的关键技术
  5. 完整代码
  6. 运行结果与注意事项

1. 项目简介

腾讯新闻网站包含丰富的新闻资源。我们的目标是:

  • 爬取文章的标题和部分内容(200个字符)。
  • 点击“下一页”按钮后跳转到新页面并继续爬取。
  • 处理爬取内容中的特殊字符。
  • 将爬取到的内容保存到 CSV 文件中。

本项目适合初学者学习 Selenium 的基础操作,例如页面切换和元素交互。


2. 依赖安装

在开始前,需要安装以下依赖:

  1. Python 环境:确保安装了 Python 3.7 或以上版本。
  2. Selenium:用于网页自动化。
  3. WebDriver Manager:自动管理浏览器驱动。

运行以下命令安装必要的库:

pip install selenium webdriver-manager pandas

3. 实现功能的代码

以下是主要功能实现:

1. Selenium 驱动设置

通过 WebDriver Manager 自动管理 ChromeDriver,避免手动下载和配置。

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManagerdef setup_driver():options = Options()options.add_argument("--headless")  # 无头模式运行options.add_argument("--disable-gpu")driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)return driver

2. 点击下一页并切换窗口

实现点击下一页按钮,切换到新打开的窗口,并关闭旧窗口。

from selenium.webdriver.common.by import By
import timedef click_next_and_switch_window(driver):current_window = driver.current_window_handlenext_button = driver.find_element(By.XPATH, '/html/body/div[3]/div[1]/div[3]/div/div/ul/li[6]/div[2]/h3/a')next_button.click()time.sleep(3)all_windows = driver.window_handlesdriver.close()driver.switch_to.window(all_windows[-1])time.sleep(2)

3. 爬取文章内容

爬取标题和正文的前200个字符,并使用正则表达式清理标题。

import redef crawl_tencent_news(start_url, max_articles=50):driver = setup_driver()articles = []driver.get(start_url)time.sleep(2)for _ in range(max_articles):try:title = driver.find_element(By.XPATH, '//*[@id="dc-normal-body"]/div[3]/div[1]/div[1]/div[2]/h1').texttitle = re.sub(r"[^a-zA-Z0-9\u4e00-\u9fa5\s。,!?]", "", title)content = driver.find_element(By.XPATH, '//*[@id="ArticleContent"]/div[2]/div').textshort_content = content[:200]articles.append({"Title": title, "Content": short_content})click_next_and_switch_window(driver)except:breakdriver.quit()return articles

4. 保存为 CSV

将爬取到的内容保存到 CSV 文件中。

import pandas as pddef save_to_csv(articles, filename):df = pd.DataFrame(articles)df.to_csv(filename, index=False, encoding="utf-8")print(f"已将 {len(articles)} 篇文章保存到 {filename}.")

4. 完整代码

以下是完整代码整合:

import re
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
import time
import pandas as pddef setup_driver():options = Options()options.add_argument("--headless")options.add_argument("--disable-gpu")driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)return driverdef click_next_and_switch_window(driver):current_window = driver.current_window_handlenext_button = driver.find_element(By.XPATH, '/html/body/div[3]/div[1]/div[3]/div/div/ul/li[6]/div[2]/h3/a')next_button.click()time.sleep(3)all_windows = driver.window_handlesdriver.close()driver.switch_to.window(all_windows[-1])time.sleep(2)def crawl_tencent_news(start_url, max_articles=50):driver = setup_driver()articles = []driver.get(start_url)time.sleep(2)for _ in range(max_articles):try:title = driver.find_element(By.XPATH, '//*[@id="dc-normal-body"]/div[3]/div[1]/div[1]/div[2]/h1').texttitle = re.sub(r"[^a-zA-Z0-9\u4e00-\u9fa5\s。,!?]", "", title)content = driver.find_element(By.XPATH, '//*[@id="ArticleContent"]/div[2]/div').textshort_content = content[:200]articles.append({"Title": title, "Content": short_content})click_next_and_switch_window(driver)except:breakdriver.quit()return articlesdef save_to_csv(articles, filename):df = pd.DataFrame(articles)df.to_csv(filename, index=False, encoding="utf-8")print(f"已将 {len(articles)} 篇文章保存到 {filename}.")def main():start_url = "https://news.qq.com/rain/a/20241201A03DNQ00"articles = crawl_tencent_news(start_url, max_articles=50)if articles:save_to_csv(articles, "tencent_articles.csv")if __name__ == "__main__":main()

5. 运行结果与注意事项

结果

运行代码后,将爬取到的文章标题和内容保存到 tencent_articles.csv 文件中,数据示例如下:

TitleContent
腾讯新闻标题示例这是文章内容的前200个字符…

注意事项

  1. 网络延迟:需要确保网络连接畅通,避免加载超时。
  2. 页面变化:目标网站的结构可能会变化,需定期更新 XPath。
  3. 反爬机制:添加 time.sleep() 避免触发反爬机制。

希望这篇博客能帮助你理解和实践 Selenium 爬虫的开发过程!如有疑问,请随时留言讨论!

相关文章:

使用 Selenium 和 Python 爬取腾讯新闻:从基础到实践

使用 Selenium 和 Python 爬取腾讯新闻:从基础到实践 在这篇博客中,我们将介绍如何利用 Selenium 和 Python 爬取腾讯新闻的内容,并将结果保存到 CSV 文件中。本教程包含以下内容: 项目简介依赖安装实现功能的代码实现中的关键技…...

CAD深度清理工具-AVappsDrawingPurge9.0.0(2024.8.27版本) 支持版本CAD2022-2025-供大家学习研究参考

图形文件DWG体积很大:通常没有明显的数据。同时,还其他症状包括: (1)无法复制和粘贴图元。 (2)悬挂较长时间选择文本与 “特性”选项板上打开。 (3)图形文件需要很长时间…...

vue3+vite使用vite-plugin-electron-renderer插件和script-loader插件有冲突

报错信息:Error: Dynamic require of "path" is not supported 报错问题是在使用vite-plugin-electron-renderer插件不支持import动态引入,该报错信息并不准确,实际原因是vite-plugin-electron-renderer插件和script-loader插件有…...

领养我的宠物:SpringBoot开发指南

第2章 开发环境与技术 本章节对开发宠物领养系统需要搭建的开发环境,还有宠物领养系统开发中使用的编程技术等进行阐述。 2.1 Java语言 Java语言是当今为止依然在编程语言行业具有生命力的常青树之一。Java语言最原始的诞生,不仅仅是创造者感觉C语言在编…...

直击高频编程考点:聚焦新版综合编程能力考查汇总

目录 一、业务性编程和广度能力考查 (一)基本定义 (二)必要性分析 二、高频考查样题(编程扩展问法) 考题1: 用java 代码实现一个死锁用例,说说怎么解决死锁问题?(高…...

【EI会议征稿 | ACM出版 】第六届计算机信息和大数据应用国际学术会议(CIBDA 2025)

大会官网:www.ic-cibda.org 大会时间:2025年3月14-16日 大会地点:中国-武汉 收录检索:EI Compendex,Scopus 接受/拒稿通知:投稿后约3~8天 大会简介 第六届计算机信息和大数据应用国际学术会议&#xff…...

淘宝商品数据获取:Python爬虫技术的应用与实践

引言 随着电子商务的蓬勃发展,淘宝作为中国最大的电商平台之一,拥有海量的商品数据。这些数据对于市场分析、消费者行为研究、商品推荐系统等领域具有极高的价值。然而,如何高效、合法地从淘宝平台获取这些数据,成为了一个技术挑…...

【C++】getchar() 与 putchar() 的深入解析

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯函数原型及头文件包含💯 getchar() 和 putchar() 的基本概念2.1 getchar() 函数2.2 putchar() 函数 💯输入输出的关系与返回值的解释3.1 getchar() …...

Centos7安装MySQL8.0详细教程(压缩包安装方式)

本章教程,主要介绍如何在Centos7上安装MySQL8.0版本数据库(压缩包安装方式) 一、卸载系统自带的 Mariadb 1、查询 rpm -qa|grep mariadb2.、卸载 如果有查询结果,就进行卸载,没有就跳过该步骤。 rpm -e --nodeps mar…...

深度学习的python基础(1)

一.tensor创建 1.张量的定义 张量在形式上就是多维数组,例如标量就是0维张量,向量就是一维张量,矩阵就是二维张量,而三维张量就可以想象RGB图片,每个channel是一个二维的矩阵,共有三个channel&#xff0…...

拥抱 OpenTelemetry:阿里云 Java Agent 演进实践

作者:陈承 背景 在 2018 年的 2 月,ARMS Java Agent 的第一个版本正式发布,为用户提供无侵入的的可观测数据采集服务。6 年后的今天,随着软件技术的迅猛发展、业务场景的逐渐丰富、用户规模的快速增长,我们逐渐发现过…...

003 MATLAB基础计算

01 方程组的求解 多项式及其运算 多项式在MATLAB中以向量形式存储。 即n次多项式用一个长度为n1的系数向量来表示,且按降幂,缺少的幂次对应的向量元素为0。 多项式的运算主要包括多项式的四则运算、求导、求值和求根运算 多项式的四则运算&#xff1a…...

安卓逆向之Android-Intent介绍

Intent是各个组件之间交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,而且还能在各组件之间传递数据。Intent一般可用于启动Activity、启动Service、发送广播等场景。Intent有多个构造函数的重载。 显式intent 显式 Intent 明确指定要启动的…...

数据库日期时间用什么类型?

数据库中的日期时间类型主要包括DATE、TIME、DATETIME和TIMESTAMP等,它们在存储、格式和范围等方面有所不同。以下是这些类型的详细说明和异同比较: 1. DATE类型 用途:用于存储日期值,不包含时间部分。格式:YYYY-MM-…...

Python中字符串和正则表达式

Python中字符串和正则表达式 在Python编程中,字符串是最常用的数据类型之一。字符串用于表示文本数据,而正则表达式则是一种强大的工具,用于处理和匹配字符串中的模式。本文将介绍Python中的字符串操作、字符串格式化以及如何使用正则表达式…...

Leecode刷题C语言之N皇后

执行结果:通过 执行用时和内存消耗如下&#xff1a; 代码如下&#xff1a; int solutionsSize;char** generateBoard(int* queens, int n) {char** board (char**)malloc(sizeof(char*) * n);for (int i 0; i < n; i) {board[i] (char*)malloc(sizeof(char) * (n 1))…...

即时通讯| IM+RTC在AI技术加持下的社交体验

即时通讯作为互联网的重要应用之一&#xff0c;见证了中国互联网30年发展的辉煌历程。 它从最初的文字交流&#xff0c;发展到如今的语音、视频通话&#xff0c;甚至是虚拟现实社交&#xff0c;已经渗透到生活的社交、娱乐、商务等方方面面&#xff0c;成为现代社会不可或缺的一…...

repo仓库转移到自己本地的git服务器

前提条件&#xff1a;搭建好gitolite 以转移正点原子rk3568_linux工程为例子&#xff0c;将其转移到自己的git服务器。 获取完整repo仓库 将正点原子epo仓库sync出来 evanevan-X99:~/SRC/atk$ .repo/repo/repo sync -l -j10 evanevan-X99:~/SRC/atk$ .repo/repo/repo list -n…...

微服务即时通讯系统的实现(服务端)----(2)

目录 1. 语音识别子服务的实现1.1 功能设计1.2 模块划分1.3 模块功能示意图1.4 接口的实现 2. 文件存储子服务的实现2.1 功能设计2.2 模块划分2.3 模块功能示意图2.4 接口的实现 3. 用户管理子服务的实现3.1 功能设计3.2 模块划分3.3 功能模块示意图3.4 数据管理3.4.1 关系数据…...

人工智能-深度学习-神经网络-激活函数

激活函数通过引入非线性来增强神经网络的表达能力&#xff0c;对于解决线性模型的局限性至关重要。由于反向传播算法(BP)用于更新网络参数&#xff0c;因此激活函数必须是可微的&#xff0c;也就是说能够求导的。 满足激活函数的条件 1.可微分&#xff0c;也就是可求导 激活函…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...