Python爬虫实战:手把手教你用 Python 爬取网易新闻每日热文,小白也能轻松上手
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模拟浏览器访问:
defcrawl_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 andlen(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未获取到数据,执行方案2ifnot 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 andlen(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['链接']notin 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 inenumerate(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到本地withopen(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 defcrawl_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 andlen(title)>5:# 过滤掉过短的标题(可能是无关链接)# 确保链接是有效的新闻链接if href.startswith('http')and('news.163.com'in href or'www.163.com'in href): hot_recommendations.append({'标题': title,'链接': href })# 方法2: 如果上述方法找不到,尝试通过类名查找ifnot 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 andlen(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['链接']notin 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 inenumerate(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"withopen(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
- 本专栏特色资源:
- 代码资源仓库:ZEEKLOG专属资源在线获取
- 海量Python教程:关注公众号:xcLeigh,获取网盘地址
- 一对一答疑:添加微信与博主在线沟通(
备注“Python专栏”)
- 相关书籍推荐:
| 书名 | 说明 |
|---|---|
![]() | 成功的Python包应该安装简便、运行稳定,并能持续可靠地更新。发布一个完美的Python包需要遵循严谨的流程体系,包括系统化测试和代码审查,以及完善的文档体系。值得庆幸的是,Python生态提供了丰富的工具和技术,可实现从项目初始化到版本发布的全流程自动化。 本书深度解析了以自动化和可扩展的方式共享Python 代码的实用流程。通过实际操作,读者可轻松掌握最新打包工具的运用技巧,深入了解包测试和持续集成的方方面面,甚至可获得创建可持续开源项目的专业技巧,包括许可协议、文档编写及培育贡献者社区等关键维度。🥇 点击购买 |
![]() | 本书涵盖的主题十分广泛,首先介绍贝叶斯推理及其与深度学习的关系。然后探索各种主流的贝叶斯深度学习方法,展示如何在Python和Tensorflow中实现这些方法。本书文笔优美,通俗易懂,即使是不熟悉贝叶斯统计或深度学习的读者也能阅读学习。我特别喜欢第5章。该章很好地解释了PBP和BBB,列举了在Python和Tensorflow中实现和扩展这些方法的示例。强烈建议有兴趣学习BDL的人士阅读本书。我相信,任何读过本书的人都能更深入地理解贝叶斯深度学习。🥇 点击购买 |
联系博主
xcLeigh 博主,全栈领域优质创作者,博客专家,目前,活跃在ZEEKLOG、微信公众号、小红书、知乎、掘金、快手、思否、微博、51CTO、B站、腾讯云开发者社区、阿里云开发者社区等平台,全网拥有几十万的粉丝,全网统一IP为 xcLeigh。希望通过我的分享,让大家能在喜悦的情况下收获到有用的知识。主要分享编程、开发工具、算法、技术学习心得等内容。很多读者评价他的文章简洁易懂,尤其对于一些复杂的技术话题,他能通过通俗的语言来解释,帮助初学者更好地理解。博客通常也会涉及一些实践经验,项目分享以及解决实际开发中遇到的问题。如果你是开发领域的初学者,或者在学习一些新的编程语言或框架,关注他的文章对你有很大帮助。
亲爱的朋友,无论前路如何漫长与崎岖,都请怀揣梦想的火种,因为在生活的广袤星空中,总有一颗属于你的璀璨星辰在熠熠生辉,静候你抵达。
愿你在这纷繁世间,能时常收获微小而确定的幸福,如春日微风轻拂面庞,所有的疲惫与烦恼都能被温柔以待,内心永远充盈着安宁与慰藉。
至此,文章已至尾声,而您的故事仍在续写,不知您对文中所叙有何独特见解?期待您在心中与我对话,开启思想的新交流。
💞 关注博主 🌀 带你实现畅游前后端!
🏰 大屏可视化 🌀 带你体验酷炫大屏!
💯 神秘个人简介 🌀 带你体验不一样得介绍!
🥇 从零到一学习Python 🌀 带你玩转Python技术流!
🏆 前沿应用深度测评 🌀 前沿AI产品热门应用在线等你来发掘!
💦 注:本文撰写于ZEEKLOG平台,作者:xcLeigh(所有权归作者所有) ,https://xcleigh.blog.ZEEKLOG.net/,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。
📣 亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(或者关注下方公众号,看见后第一时间回复,还有海量编程资料等你来领!),博主看见后一定及时给您答复 💌💌💌

