㊙️本期内容已收录至专栏《Python爬虫实战》,持续完善知识体系与项目实战,建议先订阅收藏,后续查阅更方便~持续更新中!
㊗️爬虫难度指数:⭐
🚫声明:本数据&代码仅供学习交流,严禁用于商业用途、倒卖数据或违反目标站点的服务条款等,一切后果皆由使用者本人承担。公开榜单数据一般允许访问,但请务必遵守"君子协议",技术无罪,责任在人。

全文目录:
-
-
- [🌟 开篇语](#🌟 开篇语)
- [1️⃣ 标题 && 摘要(Abstract)](#1️⃣ 标题 && 摘要(Abstract))
- [2️⃣ 背景与需求(Why)](#2️⃣ 背景与需求(Why))
- [3️⃣ 合规与注意事项(必写)](#3️⃣ 合规与注意事项(必写))
- [4️⃣ 技术选型与整体流程(What/How)](#4️⃣ 技术选型与整体流程(What/How))
- [5️⃣ 环境准备与依赖安装(可复现)](#5️⃣ 环境准备与依赖安装(可复现))
- [6️⃣ 核心实现:请求层(Fetcher)](#6️⃣ 核心实现:请求层(Fetcher))
- [7️⃣ 核心实现:解析层(Parser)](#7️⃣ 核心实现:解析层(Parser))
- [8️⃣ 数据存储与导出(Storage)](#8️⃣ 数据存储与导出(Storage))
- [9️⃣ 运行方式与结果展示(必写)](#9️⃣ 运行方式与结果展示(必写))
- [🔟 常见问题与排错(经验之谈)](#🔟 常见问题与排错(经验之谈))
- [1️⃣1️⃣ 进阶优化(可选但加分)](#1️⃣1️⃣ 进阶优化(可选但加分))
- [1️⃣2️⃣ 总结与延伸阅读](#1️⃣2️⃣ 总结与延伸阅读)
- [🌟 文末](#🌟 文末)
-
- [📌 专栏持续更新中|建议收藏 + 订阅](#📌 专栏持续更新中|建议收藏 + 订阅)
- [✅ 互动征集](#✅ 互动征集)
-
🌟 开篇语
哈喽,各位小伙伴们你们好呀~我是【喵手】。
运营社区: C站 / 掘金 / 腾讯云 / 阿里云 / 华为云 / 51CTO
欢迎大家常来逛逛,一起学习,一起进步~🌟
我长期专注 Python 爬虫工程化实战 ,主理专栏 《Python爬虫实战》:从采集策略 到反爬对抗 ,从数据清洗 到分布式调度 ,持续输出可复用的方法论与可落地案例。内容主打一个"能跑、能用、能扩展 ",让数据价值真正做到------抓得到、洗得净、用得上。
📌 专栏食用指南(建议收藏)
- ✅ 入门基础:环境搭建 / 请求与解析 / 数据落库
- ✅ 进阶提升:登录鉴权 / 动态渲染 / 反爬对抗
- ✅ 工程实战:异步并发 / 分布式调度 / 监控与容错
- ✅ 项目落地:数据治理 / 可视化分析 / 场景化应用
📣 专栏推广时间 :如果你想系统学爬虫,而不是碎片化东拼西凑,欢迎订阅/关注专栏👉《Python爬虫实战》👈
💕订阅后更新会优先推送,按目录学习更高效~
1️⃣ 标题 && 摘要(Abstract)
项目名称:JiemianNewsRadar_v1.0
核心工具:Python 3 + Requests + BeautifulSoup4
产出目标:自动化抓取"界面新闻-科技频道"的最新文章列表,提取标题、发布时间、摘要(导语)及原文链接,生成结构化的 CSV 简报。
读完这篇文章,你将获得:
- 📰 列表页通用解析:掌握如何处理典型的"左图右文"或"卡片式"新闻布局。
- 🧹 时间格式清洗:学会处理"1小时前"、"刚刚"这种相对时间,虽然本例主要演示提取,但会提及思路。
- 🚀 翻页逻辑 :了解 URL 拼接翻页(
page_2.html)的基础逻辑。
2️⃣ 背景与需求(Why)
为什么要爬?
- 信息聚合:不想每天打开十几个网站刷新闻?写个脚本把它们聚合在一起。
- 趋势分析:抓取一个月的标题,做个词云,看看最近科技圈到底在炒作"AI"还是"元宇宙"?
- 语料积累:新闻摘要是训练文本分类模型(如 BERT)的绝佳语料。
🎯 目标站点 :https://www.jiemian.com/lists/84.html (科技频道)
📋 目标字段清单:
- Title (新闻标题):核心内容
- Abstract (摘要/导语):快速了解新闻讲什么
- Date (发布时间):发布日期
- Link (详情链接):点击跳转
3️⃣ 合规与注意事项(必写)
- Robots 协议 :新闻网站的内容通常有版权保护。爬取内容仅限于个人阅读与分析,严禁未经授权直接转载到其他平台("洗稿"是违法的!)。
- 频率控制 :新闻网站更新快,但不需要秒级监控。建议设置 10~30 分钟 运行一次即可。
- 资源占用:我们只抓取 HTML 文本,不下载图片,尽量减少对对方服务器带宽的消耗。
4️⃣ 技术选型与整体流程(What/How)
技术栈:
- Requests:获取静态 HTML。界面新闻的首屏是服务器渲染的(SSR),直接请求就能拿到数据,不需要 Selenium。
- BeautifulSoup4 :解析 HTML 里的
div卡片。
🌊 整体流程:
构造 URL (支持翻页) ➔ Requests 请求 ➔ 定位 .item-news 卡片 ➔ 提取 Title/Date/Summary ➔ 清洗数据 ➔ CSV 归档
5️⃣ 环境准备与依赖安装(可复现)
Python 版本:3.8+
依赖安装:
bash
pip install requests beautifulsoup4 pandas
📂 项目结构:
text
news_radar/
├── reports/
│ └── jiemian_tech_news.csv
├── radar.py
└── requirements.txt
6️⃣ 核心实现:请求层(Fetcher)
界面新闻的翻页逻辑很简单:
- 第 1 页:
https://www.jiemian.com/lists/84.html - 第 2 页:
https://www.jiemian.com/lists/84_2.html
我们需要一个函数能动态生成这个 URL。
python
import requests
import time
from random import choice
def fetch_news_page(page_num=1):
# 基础 URL 模板
if page_num == 1:
url = "https://www.jiemian.com/lists/84.html"
else:
url = f"https://www.jiemian.com/lists/84_{page_num}.html"
# 伪装 UA
user_agents = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15'
]
headers = {
'User-Agent': choice(user_agents),
'Referer': 'https://www.jiemian.com/'
}
try:
print(f"📡 正在扫描频道页: {url}")
resp = requests.get(url, headers=headers, timeout=10)
resp.raise_for_status()
return resp.text
except Exception as e:
print(f"❌ 扫描失败: {e}")
return None
7️⃣ 核心实现:解析层(Parser)
这是关键!我们需要在 HTML 的海洋里找到每一条新闻的"容器"。
经过浏览器 F12 检查,界面新闻的每一条都在 <div class="item-news"> 里。
python
from bs4 import BeautifulSoup
def parse_news_list(html):
if not html: return []
soup = BeautifulSoup(html, 'html.parser')
news_list = []
# 找到新闻列表容器
# 界面新闻通常有一个大的容器叫 list-view 或直接找 item-news
items = soup.find_all('div', class_='item-news')
for item in items:
try:
# 1. 提取标题与链接
# 标题在 <h3><a href="...">Title</a></h3>
header_tag = item.find('div', class_='news-header')
if not header_tag: continue # 过滤掉可能存在的广告空盒子
h3 = header_tag.find('h3')
a_tag = h3.find('a')
title = a_tag.get_text(strip=True)
link = a_tag['href']
# 2. 提取时间
# 时间在 <span class="date">
date_tag = header_tag.find('span', class_='date')
date = date_tag.get_text(strip=True) if date_tag else "N/A"
# 3. 提取摘要
# 摘要在 <div class="news-body"><p>...</p></div>
# 注意:有时摘要可能是 hidden 的,或者不存在
body_tag = item.find('div', class_='news-body')
summary = "No Summary"
if body_tag:
p_tag = body_tag.find('p')
if p_tag:
summary = p_tag.get_text(strip=True)
news_list.append({
'Title': title,
'Date': date,
'Abstract': summary,
'Link': link
})
except AttributeError as e:
# 容错处理,防止单条数据结构异常导致崩溃
continue
return news_list
8️⃣ 数据存储与导出(Storage)
python
import pandas as pd
import os
import datetime
def save_report(data):
if not data:
print("📭 本次扫描未发现新闻。")
return
df = pd.DataFrame(data)
# 生成带时间戳的文件名,方便每天存档
today_str = datetime.date.today().strftime('%Y%m%d')
filename = f"reports/jiemian_tech_{today_str}.csv"
if not os.path.exists('reports'):
os.makedirs('reports')
# 如果文件存在,可以选择 header=False 进行追加,这里简单演示覆盖
df.to_csv(filename, index=False, encoding='utf-8-sig')
print(f"💾 情报已归档: {filename} (共 {len(df)} 条)")
9️⃣ 运行方式与结果展示(必写)
我们抓取前 3 页,看看最近科技圈发生了什么。
python
def main():
print("🚀 科技情报雷达启动...")
all_news = []
# 抓取前 3 页
for page in range(1, 4):
html = fetch_news_page(page)
if html:
batch = parse_news_list(html)
all_news.extend(batch)
print(f" ✅ 第 {page} 页捕获 {len(batch)} 条情报")
# 礼貌延时
time.sleep(1.5)
save_report(all_news)
if __name__ == "__main__":
main()
📊 运行结果预览:
text
🚀 科技情报雷达启动...
📡 正在扫描频道页: https://www.jiemian.com/lists/84.html
✅ 第 1 页捕获 15 条情报
📡 正在扫描频道页: https://www.jiemian.com/lists/84_2.html
✅ 第 2 页捕获 15 条情报
...
💾 情报已归档: reports/jiemian_tech_20231027.csv (共 45 条)
CSV 文件预览:
| Title | Date | Abstract | Link |
|---|---|---|---|
| 华为发布三季度财报,净利润... | 2小时前 | 10月27日消息,华为今日发布... | https://... |
| 苹果新款 Mac 即将登场 | 昨天 18:30 | 苹果公司宣布将于北京时间... | https://... |
| 百度李彦宏:大模型将重构... | 2023-10-25 | 在今日举行的... | https://... |
🔟 常见问题与排错(经验之谈)
-
没有抓到摘要?
- 原因:有些网站在列表页只放图片和标题,不放摘要(为了让你点进去看广告)。界面新闻大部分有,但如果是纯图片新闻可能就没有。
- 对策 :如果必须要有摘要,需要拿着
Link再发一次请求进详情页去抓(参考前面的教程)。
-
Date 是"2小时前"?
- 这是相对时间。如果你需要存入数据库做时间排序,需要写一个清洗函数,把"2小时前"转换为
datetime.now() - timedelta(hours=2)。
- 这是相对时间。如果你需要存入数据库做时间排序,需要写一个清洗函数,把"2小时前"转换为
-
403 Forbidden?
- 新闻网站通常会有防火墙。如果一直 403,尝试更新
headers里的Cookie,或者换一个 IP。
- 新闻网站通常会有防火墙。如果一直 403,尝试更新
1️⃣1️⃣ 进阶优化(可选但加分)
-
关键词过滤:
- 在保存前加个判断:
if "AI" in title or "人工智能" in title:,这样你就得到了一个专属的"AI 日报"。
- 在保存前加个判断:
-
钉钉/飞书推送:
- 抓取完成后,把 Top 5 的新闻标题直接推送到手机上,上班路上就能看。
-
定时任务:
- 在 Linux 上使用
crontab -e设置0 8 * * * python radar.py,每天早上 8 点自动运行。
- 在 Linux 上使用
1️⃣2️⃣ 总结与延伸阅读
这个脚本虽然简单,但它已经具备了网络爬虫 和数据聚合的雏形。新闻类网站结构通常比较稳定,非常适合作为日常练习的对象。
复盘:
- 我们利用 URL 的规律(
_2.html)轻松搞定了翻页。 - 我们学会了从复杂的 DOM 树中提取"摘要"这种非结构化文本。
下一步可以做什么?
- 挑战澎湃新闻:澎湃新闻的列表页加载更多是 AJAX 动态请求,试试去 Network 面板抓它的 JSON 接口?
- 情感分析 :配合
SnowNLP库,分析一下今天的新闻是正面的多还是负面的多?
情报在手,天下我有!快去运行脚本,看看今天有什么大新闻吧!
🌟 文末
好啦~以上就是本期 《Python爬虫实战》的全部内容啦!如果你在实践过程中遇到任何疑问,欢迎在评论区留言交流,我看到都会尽量回复~咱们下期见!
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦~
三连就是对我写作道路上最好的鼓励与支持! ❤️🔥
📌 专栏持续更新中|建议收藏 + 订阅
专栏 👉 《Python爬虫实战》,我会按照"入门 → 进阶 → 工程化 → 项目落地"的路线持续更新,争取让每一篇都做到:
✅ 讲得清楚(原理)|✅ 跑得起来(代码)|✅ 用得上(场景)|✅ 扛得住(工程化)
📣 想系统提升的小伙伴:强烈建议先订阅专栏,再按目录顺序学习,效率会高很多~

✅ 互动征集
想让我把【某站点/某反爬/某验证码/某分布式方案】写成专栏实战?
评论区留言告诉我你的需求,我会优先安排更新 ✅
⭐️ 若喜欢我,就请关注我叭~(更新不迷路)
⭐️ 若对你有用,就请点赞支持一下叭~(给我一点点动力)
⭐️ 若有疑问,就请评论留言告诉我叭~(我会补坑 & 更新迭代)
免责声明:本文仅用于学习与技术研究,请在合法合规、遵守站点规则与 Robots 协议的前提下使用相关技术。严禁将技术用于任何非法用途或侵害他人权益的行为。技术无罪,责任在人!!!