Python爬虫实战:手把手教你用 Python 爬取网易新闻每日热文,小白也能轻松上手
Python爬虫实战:手把手教你用 Python 爬取网易新闻每日热文,小白也能轻松上手,该教程详细讲解如何用 Python 爬取网易新闻每日热文,先介绍爬虫 “请求 - 解析 - 提取 - 保存” 原理及 requests、BeautifulSoup4 等必备库的安装,再逐段解析完整代码:从设置请求头模拟浏览器、发送 HTTP 请求获取网页数据,到通过关键词匹配和类名匹配双方案提取 “今日推荐” 热文,还包含数据去重、Excel 保存(按日期命名)及异常处理与调试模块。同时给出实操步骤,解答爬取不到数据、Excel 保存失败等常见问题,强调爬虫伦理与法律规范,最后提供定时爬取、多频道爬取等功能扩展建议,帮助小白轻松上手打造自动新闻采集工具。
前言
Python作为一门简洁、易读、功能强大的编程语言,其基础语法是入门学习的核心。掌握好基础语法,能为后续的编程实践打下坚实的基础。本文将全面讲解Python3的基础语法知识,适合编程初学者系统学习。Python以其简洁优雅的语法和强大的通用性,成为当今最受欢迎的编程语言。本专栏旨在系统性地带你从零基础入门到精通Python核心。无论你是零基础小白还是希望进阶的专业开发者,都将通过清晰的讲解、丰富的实例和实战项目,逐步掌握语法基础、核心数据结构、函数与模块、面向对象编程、文件处理、主流库应用(如数据分析、Web开发、自动化)以及面向对象高级特性,最终具备独立开发能力和解决复杂问题的思维,高效应对数据分析、人工智能、Web应用、自动化脚本等广泛领域的实际需求。
🥇 点击进入Python入门专栏,Python凭借简洁易读的语法,是零基础学习编程的理想选择。本专栏专为初学者设计,系统讲解Python核心基础:变量、数据类型、流程控制、函数、文件操作及常用库入门。通过清晰示例与实用小项目,助你快速掌握编程思维,打下坚实根基,迈出自动化办公、数据分析或Web开发的第一步。
🥇 点击进入Python小游戏实战专栏, 寓教于乐,用Python亲手打造经典小游戏!本专栏通过开发贪吃蛇、飞机大战、猜数字、简易版俄罗斯方块等趣味项目,在实践中掌握Python核心语法、面向对象编程、事件处理、图形界面(如Pygame)等关键技能,将枯燥的代码学习转化为可见的成果,让学习编程充满乐趣与成就感,快速提升实战能力。
🥇 点击进入Python小工具实战专栏,告别重复劳动,用Python打造效率神器!本专栏教你开发文件批量处理、自动邮件通知、简易爬虫、桌面提醒、密码生成器、天气查询等实用小工具。聚焦os、shutil、requests、smtplib、schedule等核心库,通过真实场景案例,快速掌握自动化脚本编写技巧,解放双手,显著提升工作与生活效率,让代码真正服务于你的日常。
🥇 点击进入Python爬虫实战专栏,解锁网络数据宝库!本专栏手把手教你使用Python核心库(如requests、BeautifulSoup、Scrapy)构建高效爬虫。从基础网页解析到动态页面抓取、数据存储(CSV/数据库)、反爬策略应对及IP代理使用,通过实战项目(如电商比价、新闻聚合、图片采集、舆情监控),掌握合法合规获取并利用网络数据的核心技能,让数据成为你的超能力。
🥇 点击进入Python项目实战专栏,告别碎片化学习,挑战真实项目!本专栏精选Web应用开发(Flask/Django)、数据分析可视化、自动化办公系统、简易爬虫框架、API接口开发等综合项目。通过需求分析、架构设计、编码实现、测试部署的全流程,深入掌握工程化开发、代码复用、调试排错与团队协作核心能力,积累高质量作品集,真正具备解决复杂问题的Python实战经验。
在信息爆炸的时代,手动筛选每日热门新闻耗时又低效。本文将带你使用Python打造一个网易新闻热文爬虫,自动抓取、整理并保存每日热门新闻,全程代码解析+实操步骤,即使是编程新手也能轻松掌握。
爬取网址:https://news.163.com/domestic/
爬取内容:
一、爬虫原理与工具准备
在开始编写代码前,我们先了解下爬虫的基本逻辑和所需工具,为后续开发打下基础。
1.1 爬虫核心原理
爬虫本质是模拟浏览器向目标网站发送请求,获取网页HTML数据后,从中提取有用信息(如新闻标题、链接),最后将信息整理并保存。整个过程可概括为“请求-解析-提取-保存”四步。
1.2 必备工具与安装
本次爬虫开发需要用到4个核心Python库,各库功能及安装命令如下:
库名称 | 核心功能 | 安装命令 |
---|---|---|
requests | 发送HTTP请求,获取网页数据 | pip install requests |
BeautifulSoup4 | 解析HTML文档,提取目标信息 | pip install beautifulsoup4 |
pandas | 数据结构化处理,方便保存为Excel | pip install pandas |
openpyxl | 支持pandas将数据写入Excel文件 | pip install openpyxl |
安装完成后,可在命令行输入pip list
检查是否安装成功。
二、完整代码解析:从请求到保存全流程
下面我们逐段解析代码,理解每一步的作用和原理,让你不仅会用,还能明白为什么这么用。
2.1 导入所需库
首先导入爬虫过程中需要的所有库,每个库的作用已在注释中说明:
# 发送HTTP请求,获取网页数据
import requests
# 解析HTML文档,提取目标信息
from bs4 import BeautifulSoup
# 数据结构化处理,生成DataFrame便于保存
import pandas as pd
# 控制程序等待时间,避免请求过于频繁
import time
# 处理文件路径、判断文件是否存在等操作
import os
# 获取当前日期,用于生成带日期的文件名
from datetime import datetime
# 正则表达式,用于匹配包含特定关键词的元素(如“今日推荐”“HOT”)
import re
2.2 定义爬虫主函数 crawl_163_news()
这是整个爬虫的核心函数,包含了“请求网页-解析数据-提取信息-去重-保存”的完整逻辑,我们分模块解析。
模块1:设置请求头,模拟浏览器访问
为什么需要请求头?因为很多网站会识别请求来源,如果发现是爬虫程序(而非正常浏览器),会拒绝提供数据。所以我们需要设置headers
模拟浏览器访问:
def crawl_163_news():
# 设置请求头,模拟Chrome浏览器访问
headers = {
# User-Agent:告诉网站“我是Chrome浏览器”,核心防反爬字段
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
# 告诉网站可接受的内容格式
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
# 告诉网站可接受的语言(中文)
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
# 告诉网站可接受的压缩格式,减少数据传输量
'Accept-Encoding': 'gzip, deflate',
# 保持连接,提升请求效率
'Connection': 'keep-alive',
# 告诉网站需要升级到HTTPS(如果支持)
'Upgrade-Insecure-Requests': '1',
}
# 目标爬取网址:网易新闻国内频道
url = 'https://news.163.com/domestic/'
小技巧:你的浏览器User-Agent可以通过“F12→Network→任意请求→Headers→Request Headers”找到,替换代码中的User-Agent可进一步提升模拟真实性。
模块2:发送HTTP请求,获取网页数据
使用requests.get()
发送请求,同时加入异常处理,避免因网络问题导致程序崩溃:
try:
print("正在获取网易新闻页面...")
# 发送GET请求,超时时间设为15秒(避免程序一直等待)
response = requests.get(url, headers=headers, timeout=15)
# 检查请求是否成功:若状态码不是200(正常),则抛出异常
response.raise_for_status()
# 设置编码为UTF-8,避免中文乱码
response.encoding = 'utf-8'
# 使用BeautifulSoup解析HTML,指定解析器为html.parser(Python内置,无需额外安装)
soup = BeautifulSoup(response.text, 'html.parser')
模块3:提取“今日推荐”热文(双方案保障)
为了避免因网站页面结构变化导致爬取不到数据,我们设计了两种提取方案,确保稳定性。
方案1:通过关键词匹配“今日推荐/HOT”板块
先找到包含“今日推荐”“HOT”“热门推荐”关键词的标题元素,再获取其相邻的新闻链接:
# 存储提取的热门新闻
hot_recommendations = []
# 查找包含“今日推荐”“HOT”“热门推荐”的h2/h3/div标签
hot_titles = soup.find_all(['h2', 'h3', 'div'], string=re.compile(r'今日推荐|HOT|热门推荐'))
for title_element in hot_titles:
# 获取关键词标签的父级div容器(通常新闻列表在父容器中)
container = title_element.find_parent('div')
if container:
# 在父容器中找到所有带链接的a标签
links = container.find_all('a', href=True)
for link in links:
# 提取新闻标题(去除前后空格)
title = link.get_text().strip()
# 提取新闻链接
href = link['href']
# 过滤条件:标题非空、链接非空、标题长度>5(避免无关短链接)
if title and href and len(title) > 5:
# 确保是网易新闻的有效链接
if href.startswith('http') and ('news.163.com' in href or 'www.163.com' in href):
hot_recommendations.append({
'标题': title,
'链接': href
})
方案2:通过类名匹配新闻列表(方案1失效时启用)
如果方案1没找到数据,说明“今日推荐”板块结构可能变了,此时通过类名匹配常见的新闻列表(如类名含“list”“news”“cm”):
# 如果方案1未获取到数据,执行方案2
if not hot_recommendations:
# 查找类名包含list/cm/news的ul标签(新闻列表常用ul包裹)
for ul in soup.find_all('ul', class_=lambda x: x and ('list' in x or 'cm' in x or 'news' in x)):
# 提取ul中的所有新闻链接
for item in ul.find_all('a', href=True):
title = item.get_text().strip()
href = item['href']
# 同样应用过滤条件
if title and href and len(title) > 5:
if href.startswith('http') and ('news.163.com' in href or 'www.163.com' in href):
hot_recommendations.append({
'标题': title,
'链接': href
})
模块4:数据去重(避免重复新闻)
由于网页中可能存在重复链接(如同一新闻在多个板块出现),需要通过“链接”字段去重:
# 用集合存储已见过的链接(集合特性:元素不重复)
seen = set()
unique_recommendations = []
for item in hot_recommendations:
# 如果链接未见过,加入去重后的列表
if item['链接'] not in seen:
seen.add(item['链接'])
unique_recommendations.append(item)
模块5:保存数据到Excel(带日期命名)
将去重后的新闻数据保存为Excel文件,文件名包含当前日期,方便后续查找:
if unique_recommendations:
# 获取当前日期,格式为“年月日”(如20250905)
current_date = datetime.now().strftime("%Y%m%d")
# 生成文件名:网易新闻_20250905.xlsx
excel_filename = f"网易新闻_{current_date}.xlsx"
# 将列表转换为DataFrame(pandas的表格数据格式)
df = pd.DataFrame(unique_recommendations)
# 保存为Excel,不保留索引列,使用openpyxl引擎
df.to_excel(excel_filename, index=False, engine='openpyxl')
# 打印爬取结果信息
print(f"成功爬取 {len(unique_recommendations)} 条今日推荐内容")
# 打印文件绝对路径(方便找到文件)
print(f"结果已保存到: {os.path.abspath(excel_filename)}")
# 打印前5条新闻,快速预览
print("\n前5条推荐内容:")
for i, item in enumerate(unique_recommendations[:5], 1):
print(f"{i}. {item['标题']}")
模块6:异常处理与调试(程序稳定性保障)
如果爬取不到数据或出现错误,程序会打印错误信息,并保存网页结构到本地供调试:
else:
print("未找到今日推荐内容,可能需要更新选择器")
# 生成带时间戳的调试文件名(如debug_page_20250905_143000.html)
debug_filename = f"debug_page_{datetime.now().strftime('%Y%m%d_%H%M%S')}.html"
# 保存网页完整HTML到本地
with open(debug_filename, 'w', encoding='utf-8') as f:
f.write(soup.prettify())
print(f"已保存页面结构到 {debug_filename} 供分析")
# 捕获网络请求相关错误(如超时、404、500)
except requests.RequestException as e:
print(f"网络请求错误: {e}")
# 捕获其他所有未知错误
except Exception as e:
print(f"发生错误: {e}")
2.3 程序入口:执行爬虫
最后通过if __name__ == "__main__":
确保只有直接运行脚本时才执行爬虫:
if __name__ == "__main__":
print("开始爬取网易新闻今日推荐...")
# 调用爬虫主函数
crawl_163_news()
print("程序执行完毕!")
三、实操步骤:运行爬虫并查看结果
代码编写完成后,按照以下步骤运行,轻松获取每日热文:
完整代码:
"""
爬取网易新闻,每日热文
"""
import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
import os
from datetime import datetime
import re
def crawl_163_news():
# 设置请求头,模拟浏览器访问
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Accept-Encoding': 'gzip, deflate',
'Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1',
}
url = 'https://news.163.com/domestic/'
try:
# 发送HTTP请求
print("正在获取网易新闻页面...")
response = requests.get(url, headers=headers, timeout=15)
response.raise_for_status() # 检查请求是否成功
# 设置正确的编码
response.encoding = 'utf-8'
# 使用BeautifulSoup解析HTML
soup = BeautifulSoup(response.text, 'html.parser')
# 查找今日推荐HOT部分
hot_recommendations = []
# 方法1: 查找包含"今日推荐"或"HOT"标题的部分
hot_titles = soup.find_all(['h2', 'h3', 'div'], string=re.compile(r'今日推荐|HOT|热门推荐'))
for title_element in hot_titles:
# 找到相邻的ul列表或包含链接的容器
container = title_element.find_parent('div')
if container:
# 在容器中查找所有链接
links = container.find_all('a', href=True)
for link in links:
title = link.get_text().strip()
href = link['href']
if title and href and len(title) > 5: # 过滤掉过短的标题(可能是无关链接)
# 确保链接是有效的新闻链接
if href.startswith('http') and ('news.163.com' in href or 'www.163.com' in href):
hot_recommendations.append({
'标题': title,
'链接': href
})
# 方法2: 如果上述方法找不到,尝试通过类名查找
if not hot_recommendations:
for ul in soup.find_all('ul', class_=lambda x: x and ('list' in x or 'cm' in x or 'news' in x)):
for item in ul.find_all('a', href=True):
title = item.get_text().strip()
href = item['href']
if title and href and len(title) > 5:
if href.startswith('http') and ('news.163.com' in href or 'www.163.com' in href):
hot_recommendations.append({
'标题': title,
'链接': href
})
# 去重
seen = set()
unique_recommendations = []
for item in hot_recommendations:
if item['链接'] not in seen:
seen.add(item['链接'])
unique_recommendations.append(item)
# 保存结果到Excel文件
if unique_recommendations:
# 生成文件名:网易新闻+日期
current_date = datetime.now().strftime("%Y%m%d")
excel_filename = f"网易新闻_{current_date}.xlsx"
# 创建DataFrame
df = pd.DataFrame(unique_recommendations)
# 保存到Excel
df.to_excel(excel_filename, index=False, engine='openpyxl')
print(f"成功爬取 {len(unique_recommendations)} 条今日推荐内容")
print(f"结果已保存到: {os.path.abspath(excel_filename)}")
# 打印前几条结果
print("\n前5条推荐内容:")
for i, item in enumerate(unique_recommendations[:5], 1):
print(f"{i}. {item['标题']}")
else:
print("未找到今日推荐内容,可能需要更新选择器")
# 打印页面结构以便调试
debug_filename = f"debug_page_{datetime.now().strftime('%Y%m%d_%H%M%S')}.html"
with open(debug_filename, 'w', encoding='utf-8') as f:
f.write(soup.prettify())
print(f"已保存页面结构到 {debug_filename} 供分析")
except requests.RequestException as e:
print(f"网络请求错误: {e}")
except Exception as e:
print(f"发生错误: {e}")
if __name__ == "__main__":
print("开始爬取网易新闻今日推荐...")
crawl_163_news()
print("程序执行完毕!")
3.1 运行前检查
- 确保已安装所有必备库(参考第二节1.2);
- 确认网络正常,能访问
https://news.163.com/domestic/
; - 脚本文件保存为
crawl_163_news.py
(任意名称均可,后缀为.py)。
3.2 运行爬虫
- 打开命令行,切换到脚本所在文件夹(如
cd D:\PythonProjects
); - 输入命令
python crawl_163_news.py
,按下回车; - 等待程序执行,控制台会打印爬取进度(如“正在获取网易新闻页面…”“成功爬取20条今日推荐内容”)。
3.3 查看结果
- 爬取成功后,在脚本所在文件夹会生成一个Excel文件(如
网易新闻_20250905.xlsx
); - 双击打开Excel,即可看到“标题”和“链接”两列数据,点击链接可直接跳转到新闻页面。
四、常见问题与解决方案
在使用过程中,可能会遇到一些问题,这里整理了高频问题及解决方法:
4.1 问题1:爬取不到数据,提示“未找到今日推荐内容”
原因:网易新闻页面结构更新,导致原有的关键词或类名匹配失效。
解决方案:
- 找到程序生成的
debug_page_xxxx.html
文件,用浏览器打开; - 按“F12”打开开发者工具,使用“元素选择器”(左上角箭头图标)点击页面中的“今日推荐”板块;
- 查看该板块的HTML结构,更新代码中的关键词(如
re.compile(r'新关键词')
)或类名(如class_=lambda x: x and ('新类名' in x)
)。
4.2 问题2:Excel保存失败,提示“No module named ‘openpyxl’”
原因:未安装openpyxl
库,pandas需要该库支持Excel写入。
解决方案:命令行输入pip install openpyxl
,安装完成后重新运行脚本。
4.3 问题3:网络请求错误,提示“Connection timed out”
原因:网络不稳定,或请求频率过高被网站暂时屏蔽。
解决方案:
- 检查网络连接,确保能正常访问网易新闻;
- 在
requests.get()
前加入time.sleep(3)
(等待3秒),降低请求频率,代码如下:
time.sleep(3) # 加入这行,放在response = requests.get(...)前面
response = requests.get(url, headers=headers, timeout=15)
五、爬虫伦理与法律提示
在使用爬虫时,必须遵守网站规则和法律法规,避免侵权或违规:
- 查看robots协议:了解网站允许爬取的范围(网易新闻允许爬取公开新闻内容);
- 控制爬取频率:不要频繁发送请求,建议加入
time.sleep(2-5)
,避免给网站服务器造成压力; - 仅用于个人学习:爬取的数据不可用于商业用途,如需公开使用,需获得网站授权;
- 尊重版权:新闻内容的版权归网易所有,请勿随意转载或篡改。
六、功能扩展建议
如果你想进一步提升爬虫的实用性,可以尝试以下扩展功能:
- 定时爬取:使用
schedule
库设置每日固定时间自动爬取(如每天早上8点); - 多频道爬取:除了“国内新闻”,增加“国际新闻”“财经新闻”等频道的爬取(修改
url
为对应频道地址); - 提取新闻正文:在获取新闻链接后,进一步请求链接页面,提取新闻正文、发布时间、作者等信息;
- 邮件推送:爬取完成后,通过
smtplib
库将新闻列表发送到个人邮箱,实现“每日新闻早报”。
通过本文的教程,你已经掌握了网易新闻热文爬虫的开发方法。爬虫的核心在于“理解网页结构+灵活处理异常”,后续可以尝试爬取其他网站(如新浪新闻、腾讯新闻),不断积累经验,打造更强大的数据采集工具。如果在实践中遇到问题,欢迎在评论区交流讨论!
附录:扩展学习资源
-
官方资源:
- Python官网:https://www.python.org
- PyPI:https://pypi.org(查找第三方库)
- 安装包等相关文件(另附带pycharm工具),网盘下载地址:https://pan.quark.cn/s/649af731037c
- 学习资料视频和文档资源,网盘下载地址: https://pan.quark.cn/s/ee16901a8954
-
本专栏特色资源:
- 代码资源仓库:CSDN专属资源在线获取
- 海量Python教程:关注公众号:xcLeigh,获取网盘地址
- 一对一答疑:添加微信与博主在线沟通(
备注“Python专栏”
)
-
相关书籍推荐:
书名 | 说明 |
---|---|
![]() | 成功的Python包应该安装简便、运行稳定,并能持续可靠地更新。发布一个完美的Python包需要遵循严谨的流程体系,包括系统化测试和代码审查,以及完善的文档体系。值得庆幸的是,Python生态提供了丰富的工具和技术,可实现从项目初始化到版本发布的全流程自动化。 本书深度解析了以自动化和可扩展的方式共享Python 代码的实用流程。通过实际操作,读者可轻松掌握最新打包工具的运用技巧,深入了解包测试和持续集成的方方面面,甚至可获得创建可持续开源项目的专业技巧,包括许可协议、文档编写及培育贡献者社区等关键维度。🥇 点击购买 |
![]() | 本书涵盖的主题十分广泛,首先介绍贝叶斯推理及其与深度学习的关系。然后探索各种主流的贝叶斯深度学习方法,展示如何在Python和Tensorflow中实现这些方法。本书文笔优美,通俗易懂,即使是不熟悉贝叶斯统计或深度学习的读者也能阅读学习。我特别喜欢第5章。该章很好地解释了PBP和BBB,列举了在Python和Tensorflow中实现和扩展这些方法的示例。强烈建议有兴趣学习BDL的人士阅读本书。我相信,任何读过本书的人都能更深入地理解贝叶斯深度学习。🥇 点击购买 |
联系博主
xcLeigh 博主,全栈领域优质创作者,博客专家,目前,活跃在CSDN、微信公众号、小红书、知乎、掘金、快手、思否、微博、51CTO、B站、腾讯云开发者社区、阿里云开发者社区等平台,全网拥有几十万的粉丝,全网统一IP为 xcLeigh。希望通过我的分享,让大家能在喜悦的情况下收获到有用的知识。主要分享编程、开发工具、算法、技术学习心得等内容。很多读者评价他的文章简洁易懂,尤其对于一些复杂的技术话题,他能通过通俗的语言来解释,帮助初学者更好地理解。博客通常也会涉及一些实践经验,项目分享以及解决实际开发中遇到的问题。如果你是开发领域的初学者,或者在学习一些新的编程语言或框架,关注他的文章对你有很大帮助。
亲爱的朋友,无论前路如何漫长与崎岖,都请怀揣梦想的火种,因为在生活的广袤星空中,总有一颗属于你的璀璨星辰在熠熠生辉,静候你抵达。
愿你在这纷繁世间,能时常收获微小而确定的幸福,如春日微风轻拂面庞,所有的疲惫与烦恼都能被温柔以待,内心永远充盈着安宁与慰藉。
至此,文章已至尾声,而您的故事仍在续写,不知您对文中所叙有何独特见解?期待您在心中与我对话,开启思想的新交流。
💞 关注博主 🌀 带你实现畅游前后端!
🏰 大屏可视化 🌀 带你体验酷炫大屏!
💯 神秘个人简介 🌀 带你体验不一样得介绍!
🥇 从零到一学习Python 🌀 带你玩转Python技术流!
🏆 前沿应用深度测评 🌀 前沿AI产品热门应用在线等你来发掘!
💦 注:本文撰写于CSDN平台,作者:xcLeigh(所有权归作者所有) ,https://xcleigh.blog.csdn.net/,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。
📣 亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(或者关注下方公众号,看见后第一时间回复,还有海量编程资料等你来领!),博主看见后一定及时给您答复 💌💌💌
转载自CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/weixin_43151418/article/details/151211572