Python爬虫实战:采集“界面新闻-科技频道”的文章列表,提取标题、发布时间、摘要(导语)及原文链接(附 CSV 导出)!

㊙️本期内容已收录至专栏《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. 📰 列表页通用解析:掌握如何处理典型的"左图右文"或"卡片式"新闻布局。
  2. 🧹 时间格式清洗:学会处理"1小时前"、"刚刚"这种相对时间,虽然本例主要演示提取,但会提及思路。
  3. 🚀 翻页逻辑 :了解 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://...

🔟 常见问题与排错(经验之谈)

  1. 没有抓到摘要?

    • 原因:有些网站在列表页只放图片和标题,不放摘要(为了让你点进去看广告)。界面新闻大部分有,但如果是纯图片新闻可能就没有。
    • 对策 :如果必须要有摘要,需要拿着 Link 再发一次请求进详情页去抓(参考前面的教程)。
  2. Date 是"2小时前"?

    • 这是相对时间。如果你需要存入数据库做时间排序,需要写一个清洗函数,把"2小时前"转换为 datetime.now() - timedelta(hours=2)
  3. 403 Forbidden?

    • 新闻网站通常会有防火墙。如果一直 403,尝试更新 headers 里的 Cookie,或者换一个 IP。

1️⃣1️⃣ 进阶优化(可选但加分)

  • 关键词过滤

    • 在保存前加个判断:if "AI" in title or "人工智能" in title:,这样你就得到了一个专属的"AI 日报"。
  • 钉钉/飞书推送

    • 抓取完成后,把 Top 5 的新闻标题直接推送到手机上,上班路上就能看。
  • 定时任务

    • 在 Linux 上使用 crontab -e 设置 0 8 * * * python radar.py,每天早上 8 点自动运行。

1️⃣2️⃣ 总结与延伸阅读

这个脚本虽然简单,但它已经具备了网络爬虫数据聚合的雏形。新闻类网站结构通常比较稳定,非常适合作为日常练习的对象。

复盘

  • 我们利用 URL 的规律(_2.html)轻松搞定了翻页。
  • 我们学会了从复杂的 DOM 树中提取"摘要"这种非结构化文本。

下一步可以做什么?

  • 挑战澎湃新闻:澎湃新闻的列表页加载更多是 AJAX 动态请求,试试去 Network 面板抓它的 JSON 接口?
  • 情感分析 :配合 SnowNLP 库,分析一下今天的新闻是正面的多还是负面的多?

情报在手,天下我有!快去运行脚本,看看今天有什么大新闻吧!

🌟 文末

好啦~以上就是本期 《Python爬虫实战》的全部内容啦!如果你在实践过程中遇到任何疑问,欢迎在评论区留言交流,我看到都会尽量回复~咱们下期见!

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦~
三连就是对我写作道路上最好的鼓励与支持! ❤️🔥

📌 专栏持续更新中|建议收藏 + 订阅

专栏 👉 《Python爬虫实战》,我会按照"入门 → 进阶 → 工程化 → 项目落地"的路线持续更新,争取让每一篇都做到:

✅ 讲得清楚(原理)|✅ 跑得起来(代码)|✅ 用得上(场景)|✅ 扛得住(工程化)

📣 想系统提升的小伙伴:强烈建议先订阅专栏,再按目录顺序学习,效率会高很多~

✅ 互动征集

想让我把【某站点/某反爬/某验证码/某分布式方案】写成专栏实战?

评论区留言告诉我你的需求,我会优先安排更新 ✅


⭐️ 若喜欢我,就请关注我叭~(更新不迷路)

⭐️ 若对你有用,就请点赞支持一下叭~(给我一点点动力)

⭐️ 若有疑问,就请评论留言告诉我叭~(我会补坑 & 更新迭代)


免责声明:本文仅用于学习与技术研究,请在合法合规、遵守站点规则与 Robots 协议的前提下使用相关技术。严禁将技术用于任何非法用途或侵害他人权益的行为。技术无罪,责任在人!!!

相关推荐
2301_790300963 小时前
Python单元测试(unittest)实战指南
jvm·数据库·python
Data_Journal3 小时前
Scrapy vs. Crawlee —— 哪个更好?!
运维·人工智能·爬虫·媒体·社媒营销
VCR__3 小时前
python第三次作业
开发语言·python
韩立学长3 小时前
【开题答辩实录分享】以《助农信息发布系统设计与实现》为例进行选题答辩实录分享
python·web
深蓝电商API4 小时前
async/await与多进程结合的混合爬虫架构
爬虫·架构
2401_838472514 小时前
使用Scikit-learn构建你的第一个机器学习模型
jvm·数据库·python
u0109272714 小时前
使用Python进行网络设备自动配置
jvm·数据库·python
工程师老罗4 小时前
优化器、反向传播、损失函数之间是什么关系,Pytorch中如何使用和设置?
人工智能·pytorch·python
Fleshy数模4 小时前
我的第一只Python爬虫:从Requests库到爬取整站新书
开发语言·爬虫·python
CoLiuRs4 小时前
Image-to-3D — 让 2D 图片跃然立体*
python·3d·flask