python 上海新闻爬虫, 东方网 + 澎湃新闻

news2025/5/12 13:18:24

1. 起因, 目的:

  • 继续做新闻爬虫。我之前写过。
  • 此文先记录2个新闻来源。
  • 后面打算进行过滤,比如只选出某一个类型新闻。

2. 先看效果

过滤出某种类型的新闻,然后生成 html 页面,而且,自动打开这个页面。
比如科技犯罪类的新闻。

3. 过程:

代码 1 ,爬取东方网
  • 很久之前写过,代码还能用。
  • 这里虽然是复制一下,也是为了自己方便。
import os
import csv
import time
import requests

"""
# home: https://sh.eastday.com/
# 1. 标题, url, 来源,时间
"""

headers = {
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36'
}


def get_data(pages):
    file_name = '5.8.400.csv'             # 400个标题。
    has_file =  os.path.exists(file_name)

    # 打开文件,写入模式
    with open(file_name, 'a', newline='', encoding='utf-8') as file:
        # 创建一个csv.DictWriter对象,用于写入字典数据
        columns = ['title', 'url', 'time','source']
        writer = csv.DictWriter(file, fieldnames=columns)

        # 写入表头
        if not has_file:
            writer.writeheader()

        # 爬取数据. 默认是 20页,每页20条。 每天大概有400个新闻。
        for i in range(pages):
            print(f"正在爬取第{i+1} / {pages}页数据")
            time.sleep(0.5)
            url = f"https://apin.eastday.com/apiplus/special/specialnewslistbyurl?specialUrl=1632798465040016&skipCount={i * 20}&limitCount=20"

            resp = requests.get(url, headers=headers)
            if resp.status_code!= 200:
                print(f"请求失败:{resp.status_code}")
                break

            ret = resp.json()
            junk = ret['data']['list']

            for x in junk:
                item = dict()
                # print(x)
                item["time"] = x["time"]
                item['title'] = x["title"]
                item["url"] = x["url"]
                item["source"] = x["infoSource"]

                # 写入数据
                writer.writerow(item)
                # print(item)


get_data(pages=20)
代码 2 , 爬取, 澎湃新闻
  • 也是很简单。
import os
import csv
import time
import requests
from datetime import datetime, timedelta

# 请求头
headers = {
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36',
    'Content-Type': 'application/json',  # 响应头要求 Content-Type
    'Referer': 'https://www.thepaper.cn/',  # 引荐来源,遵循 strict-origin-when-cross-origin
    'Origin': 'https://www.thepaper.cn'  # 跨域请求需要 Origin
}

def get_thepaper_data(file_name='peng_pai_400.csv', max_pages=100, channel_id='-8'):
    """
    爬取澎湃新闻数据,保存到 CSV 文件
    参数:
        file_name: 输出 CSV 文件名
        max_pages: 最大爬取页数
        channel_id: 新闻频道 ID
    """
    # 检查文件是否存在
    has_file = os.path.exists(file_name)

    # 打开 CSV 文件,追加模式
    with open(file_name, 'a', newline='', encoding='utf-8') as file:
        columns = ['title', 'url', 'time', 'source']
        writer = csv.DictWriter(file, fieldnames=columns)
        if not has_file:
            writer.writeheader()

        # 计算 startTime(当前时间戳)
        current_time = int(time.time() * 1000)  # 当前毫秒时间戳
        start_time = current_time  # 使用此时此刻的时间

        # 爬取数据
        for page in range(1, max_pages + 1):
            time.sleep(0.5)  # 请求间隔
            payload = {
                'channelId': channel_id,
                'excludeContIds': [],  # 留空,需根据实际需求调整
                'province': '',
                'pageSize': 20,
                'startTime': start_time,
                'pageNum': page
            }

            url = 'https://api.thepaper.cn/contentapi/nodeCont/getByChannelId'
            resp = requests.post(url, headers=headers, json=payload, timeout=10)
            if resp.status_code != 200:
                print(f"请求失败:{url}, 状态码: {resp.status_code}, 页码: {page}")
                break

            ret = resp.json()
            # print(f"页面 {page} 响应:{ret}")

            news_list = ret['data']['list']
            for item in news_list:
                # print(item)
                news = {}
                news['title'] = item.get('name', '')
                news['url'] = f"https://www.thepaper.cn/newsDetail_forward_{item.get('originalContId', '')}"
                news['time'] = item.get('pubTimeLong', '')
                news['source'] = item.get('authorInfo', {}).get('sname', '澎湃新闻')

                # 转换时间格式(如果 API 返回时间戳)
                news['time'] = datetime.fromtimestamp(news['time'] / 1000).strftime('%Y-%m-%d %H:%M:%S')

                # 直接写入,不去重
                writer.writerow(news)
                print(f"保存新闻:{news}")


if __name__ == "__main__":
    get_thepaper_data(file_name='peng_pai_400.csv', max_pages=20, channel_id='-8')

4. 结论 + todo

1 数据来源,还需要增加。可选项:

- 上观新闻 shobserver.com   与解放日报关联,报道上海本地案件。
- 新浪新闻 news.sina.com.cn  全国性新闻,包含科技犯罪。
- 腾讯新闻 news.qq.com       聚合多种来源,覆盖广泛。
  1. 聚合。 提取出自己感兴趣的新闻,比如,科技犯罪。

希望对大家有帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2373952.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Java实战]Spring Boot 整合 Freemarker (十一)

[Java实战]Spring Boot 整合 Freemarker (十一) 引言 Apache FreeMarker 作为一款高性能的模板引擎,凭借其简洁语法、卓越性能和灵活扩展性,在 Java Web 开发中占据重要地位。结合 Spring Boot 的自动化配置能力,开发者能快速构建动态页面、…

LeetCode 高频题实战:如何优雅地序列化和反序列化字符串数组?

文章目录 摘要描述题解答案题解代码分析编码方法解码方法 示例测试及结果时间复杂度空间复杂度总结 摘要 在分布式系统中,数据的序列化与反序列化是常见的需求,尤其是在网络传输、数据存储等场景中。LeetCode 第 271 题“字符串的编码与解码”要求我们设…

C#游戏开发中的注意事项

目录 一、性能优化:提升游戏运行效率 1. 避免不必要的循环和迭代 2. 减少字符串拼接 3. 利用Unity的生命周期函数 4. 使用对象池(Object Pooling) 二、内存管理:避免内存泄漏和资源浪费 1. 及时释放非托管资源 2. 避免空引用异常 3. 合理使用引用类型和值类型 4. …

Spring Boot项目(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot前后端分离)

下载地址: 前端:https://download.csdn.net/download/2401_83418369/90811402 后端:https://download.csdn.net/download/2401_83418369/90811405 一、前端vue部分的搭建 这里直接看另一期刊的搭建Vue前端工程部分 前端vue后端ssm项目_v…

Spyglass:在batch/shell模式下运行目标的顶层是什么?

相关阅读 Spyglasshttps://blog.csdn.net/weixin_45791458/category_12828934.html?spm1001.2014.3001.5482 除了可以在图形用户界面(GUI)中运行目标外,使用Batch模式或Shell模式也可以运行目标,如下面的命令所示。 % spyglass -project test.prj -ba…

微服务架构中如何保证服务间通讯的安全

在微服务架构中,保证服务间通信的安全至关重要。服务间的通信通常是通过HTTP、gRPC、消息队列等方式实现的,而这些通信链路可能面临多种安全风险。为了应对这些风险,可以采取多种措施来保证通信安全。 常见的服务间通信风险 1.数据泄露:在服务间通信过程中,敏感数据可能会…

工具篇-Cherry Studio之MCP使用

一、添加MCP 打开Cherry Studio,如果没有可以到官网下载:Cherry Studio 官方网站 - 全能的AI助手 按上面步骤打开同步服务器 1、先去注册ModelScope,申请令牌 2、再打开MCP广场,找到高德MCP 选择工具测试,这里有个高德的api key需要申请 打开如下地址高德开放平…

Python 运维脚本

1、备份文件 import os import shutil# 定义配置文件目录和备份目录的路径 config_dir "/root/python/to/config/files/" backup_dir "/root/python/to/backup/"# 遍历配置文件目录中的所有文件 for filename in os.listdir(config_dir):# 如果文件名以…

大模型项目:普通蓝牙音响接入DeepSeek,解锁语音交互新玩法

本文附带视频讲解 【代码宇宙019】技术方案:蓝牙音响接入DeepSeek,解锁语音交互新玩法_哔哩哔哩_bilibili 目录 效果演示 核心逻辑 技术实现 大模型对话(技术: LangChain4j 接入 DeepSeek) 语音识别(…

单链表设计与实现

01. 单链表简介 在数据结构中,单链表的实现可以分为 带头结点 和 不带头结点 两种方式,这里我们讨论第二种方式。 头结点:链表第一个节点不存实际数据,仅作为辅助节点指向首元节点(第一个数据节点)。头指…

springboot生成二维码到海报模板上

springboot生成二维码到海报模板上 QRCodeController package com.ruoyi.web.controller.app;import com.google.zxing.WriterException; import com.ruoyi.app.domain.Opportunity; import com.ruoyi.app.tool.QRCodeGenerator; import com.ruoyi.common.core.page.TableDat…

SEO长尾关键词布局优化法则

内容概要 在SEO优化体系中,长尾关键词的精准布局是突破流量瓶颈的关键路径。相较于竞争激烈的核心词,长尾词凭借其高转化率和低竞争特性,成为内容矩阵流量裂变的核心驱动力。本节将系统梳理长尾关键词布局的核心逻辑框架,涵盖从需…

python:trimesh 用于 STL 文件解析和 3D 操作

python:trimesh 是一个用于处理三维模型的库,支持多种格式的导入导出,比如STL、OBJ等,还包含网格操作、几何计算等功能。 Python Trimesh 库使用指南 安装依赖库 pip install trimesh Downloading trimesh-4.6.8-py3-none-any.w…

应急响应基础模拟靶机-security2

PS:杰克创建的流量包(result.pcap)在root目录下,请根据已有信息进行分析 1、首个攻击者扫描端口使用的工具是? 2、后个攻击者使用的漏洞扫描工具是? 3、攻击者上传webshell的绝对路径及User-agent是什么? 4、攻击者反弹shell的…

OpenCV定位地板上的书

任务目标是将下面的图片中的书本找出来: 使用到的技术包括:转灰度图、提取颜色分量、二值化、形态学、轮廓提取等。 我们尝试先把图片转为灰度图,然后二值化,看看效果: 可以看到,二值化后,书的…

NHANES稀有指标推荐:MedHi

文章题目:Association of dietary live microbe intake with frailty in US adults: evidence from NHANES DOI:10.1016/j.jnha.2024.100171 中文标题:美国成人膳食活微生物摄入量与虚弱的相关性:来自 NHANES 的证据 发表杂志&…

关于我在实现用户头像更换时遇到的图片上传和保存的问题

目录 前言 前端更换头像 后端处理 文件系统存储图片 数据库存储图片 处理图片文件 生成图片名 保存图片 将图片路径存储到数据库 完整代码 总结 前言 最近在实现一个用户头像更换的功能,但是因为之前并没有处理过图片的上传和保存,所以就开始…

10.二叉搜索树中第k小的元素(medium)

1.题目链接: 230. 二叉搜索树中第 K 小的元素 - 力扣(LeetCode)230. 二叉搜索树中第 K 小的元素 - 给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从 1 开始计数…

AlimaLinux设置静态IP

通过nmcli命令来操作 步骤 1:确认当前活动的网络接口名称 首先,需要确认当前系统中可用的网络接口名称。可以使用以下命令查看: nmcli device步骤 2:修改配置以匹配正确的接口名称 sudo nmcli connection modify ens160 ipv4.…

滑动窗口——将x减到0的最小操作数

题目: 这个题如果我们直接去思考方法是很困难的,因为我们不知道下一步是在数组的左还是右操作才能使其最小。正难则反,思考一下,无论是怎么样的,最终这个数组都会分成三个部分左中右,而左右的组合就是我们…