爬虫 新闻网站 并存储到CSV文件 以红网为例 V2.0 (控制台版)升级自定义查询关键词、时间段,详细注释

爬虫:红网网站, 获取指定关键词与指定时间范围内的新闻,并存储到CSV文件 V2.0(控制台版)

爬取目的:为了获取某一地区更全面的在红网已发布的宣传新闻稿,同时也让自己的工作更便捷

对比V1.0升级的内容:可自定义输入查询的关键词、自定义获取的时间段内的新闻,这样大家都可以用

环境:Pycharm2021,Python3.10,

安装的包:requests,csv,bs4,datetime

代码运行结果示例:

爬虫完整代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2024/4/4 21:36
# @Author : LanXiaoFang
# @Site :
# @File : RedNet.py
# @Software: PyCharm
import csv
import requests
from bs4 import BeautifulSoup
import datetime

header = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
    'Accept - Encoding': 'gzip, deflate, br',
    "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",
    'Connection': "keep - alive",
    'Referer': 'https://news-search.rednet.cn/Search?q=%E5%8F%8C%E7%89%8C',
    'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0",
    "Cookie": "wdcid=7486a2c50eaf8af8; Hm_lvt_c96b65e9975fa39afbd5e90222af5f39=1711378746,1711528844; Hm_lvt_aaecf8414f59c3fb0127932014cf53c7=1711378746,1711528844; __jsluid_s=56e0acf3607072cce852b9d4fc556f54; Hm_lpvt_c96b65e9975fa39afbd5e90222af5f39=1711528844; Hm_lpvt_aaecf8414f59c3fb0127932014cf53c7=1711528844; __jsl_clearance_s=1711530480.242|1|%2F%2BG2WNMEpLXiwlUgRr2hiMkP%2BMg%3D",
    "Upgrade-Insecure-Requests": "1",
}

article_Num_area = 1  # 用于计在标题含指定区域的存储的表中的数据的序号
article_Num = 1  # 用于计在标题不含但内容含指定区域的存储的表中的数据的序号
get_go = 0  # 获取第几页开始的数据,现在是0开始
count = 0  # 用于计算总共爬取的新闻数量

"""------Start Set 这一部分是自定义选项 查找自定义新闻------"""
# 爬取指定区域的文章 或者关键词  比如:双牌 双牌县 优化营商环境······
print("爬取指定区域的文章 或者关键词  比如:双牌 双牌县 优化营商环境")
# area = '双牌'
area = input("请输入想要搜索的关键词")

# 时间设定
# 想要获取的时间段 是个闭区间  年月日 xxxx-xx-xx
print("请输入你想要获取的时间段 是个闭区间  年月日 xxxx xx xx,例如2024 3 4")
start_time = input("请输入起始时间")  # 起始时间(包含起始日期这一天)
start_time = datetime.datetime.strptime(start_time, '%Y %m %d')

end_time = input("请输入截止时间")  # 截止时间(包含截止日期这一天)
end_time = datetime.datetime.strptime(end_time, '%Y %m %d')
"""------End Set 这一部分是自定义选项 查找自定义新闻------"""

# 获取系统时间
now = datetime.datetime.now()
year = now.year  # 年
month = now.month  # 月
day = now.day  # 日

# # 创建CSV文件并写入头部信息
with open(str(month) + '红网_标题含关键词.csv', 'w', newline='', encoding='utf-8') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(['序号', '新闻名称', '新闻来源', '媒体级别', '发布日期', '原文链接'])  # 根据实际情况定义列名
with open(str(month) + '红网_标题不含内容含关键词.csv', 'w', newline='', encoding='utf-8') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(['序号', '新闻名称', '信息来源', '媒体级别', '发布日期', '原文链接'])  # 根据实际情况定义列名

# 相当于满足条件就是一直循环
# while get_go <= 2: # 测试时用,只获取前1-3页的新闻
while get_go >= 0:

    url = 'https://news-search.rednet.cn/Search?q=' + area + '&s=0&o=1&r=0&p=' + str(get_go)

    html_p = requests.get(url, headers=header)
    html_p.encoding = 'utf-8'

    get_go += 1

    if html_p.status_code == 200:
        soups = BeautifulSoup(html_p.text, 'html.parser')
        article_info = soups.find_all('div', class_='result')
        # print(len(article_info), '\n')
        for i in article_info:
            result_info = i.find_all('div', class_='result-info')
            station_source = result_info[0].select('span')  # 选择result_info下的所有span标签
            station_info = station_source[0].text  # 文章发布站点
            source_info = station_source[1].text  # 文章来源

            print(station_info, source_info)
            # print(i.find_all('div', class_='title'), '\n')
            title_info = i.find_all('div', class_='title')
            # 文章链接
            article_href = title_info[0].a.get('href')
            print(article_href)

            # 升级版2.0,这一部分注释掉了,考虑通过文章链接进入文章详情页面获取: 新闻来源 发布时间,这样可以避免来源分析和计算时间的日期
            if station_info[3:] == area + "新闻网":
                # print("双牌新闻网文章链接:", article_href, "---------", "https://moment.rednet.cn/pc" + article_href[22:])
                article_href = "https://moment.rednet.cn/pc" + article_href[22:]
                # 修改文章来源为红网时刻
            if 'rednet' in article_href:
                source_info = "红网"
            if 'moment.rednet' in article_href:
                source_info = "红网时刻"
            if '来源' in source_info:
                source_info = station_info[3:]

            # 文章标题
            article_title = title_info[0].h3.text
            # 获取发布时间
            article_up_time = title_info[0].span.text
            print('发布时间', article_up_time)

            """本来想直接进入文章详情页面直接获取时间的,但是介于文章来源不同每种网站的时间所在标签也不一样,由此还是决定在这里的时间信息进行处理了"""
            # 把显示为进入和昨天的时间,改为具体的日期
            # 要注意 今天对应的昨天,
            # ---如果是今天是1月1日则昨天的年月日应为上一年的12月31日要注意;
            # ---如果今天是2-12月的1日则昨天的年月日应为上一月的最后一天

            if article_up_time == '今天':
                article_up_time = str(year) + '.' + str(month) + '.' + str(day)
            elif article_up_time == '昨天':
                if day == 1:
                    if month == 1:
                        year -= 1
                        month = 12
                        day = 31
                    else:
                        month -= 1
                        if month in [3, 5, 7, 8, 10, 12]:
                            day = 31
                        elif month in [4, 6, 9, 11]:
                            day = 30
                        elif month == 2:
                            if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):  # 闰年2月
                                day = 29
                            else:
                                day = 28
                article_up_time = str(year) + '.' + str(month) + '.' + str(day - 1)
            # 修改时间显示格式,-替换为.
            else:
                # article_up_time = article_up_time[:4] + '.' + article_up_time[5:7] + '.' + article_up_time[8:10]
                article_up_time = article_up_time.replace('-', '.')

            # print(count, '--名称', article_title, '来源', source_info, '日期', article_up_time, '链接', article_href)

            # 得到这篇文章发布的时间的日期格式
            date_article_up_time = datetime.datetime.strptime(article_up_time, '%Y.%m.%d')

            # 现在有个问题怎么退出循环,时间不满足就退出:现在获取到的新闻的时间<开始时间就退出
            if date_article_up_time < start_time:
                get_go = -1
                break

            # 把满足自定义时间的新闻内容保存到csv表格中
            if start_time <= date_article_up_time <= end_time:
                count += 1
                # date_article_up_time = datetime.datetime.strftime(date_article_up_time, "%Y.%m.%d")
                print( count, '名称', article_title, '来源', source_info, '日期', date_article_up_time, '链接', article_href)

                # 把数据存入表格 根据标题或内容 是否含有 #{area} 关键词 分开存储
                if area in article_title:
                    # 这个是标题含有#{area}的
                    with open(str(month) + '红网_标题含关键词.csv', 'a', newline='', encoding='utf-8') as csvfile:
                        writer = csv.writer(csvfile)
                        writer.writerow(
                            [article_Num_area, article_title, source_info, '级', article_up_time, article_href])
                        article_Num_area += 1
                else:
                    # 这个是标题不含但是内容含有#{area}的
                    with open(str(month) + '红网_标题不含内容含关键词.csv', 'a', newline='',
                              encoding='utf-8') as csvfile:
                        writer = csv.writer(csvfile)
                        writer.writerow([article_Num, article_title, source_info, '级', article_up_time, article_href])
                        article_Num += 1

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式总结-原型设计模式

原型设计模式 模式动机模式定义模式结构模式分析深拷贝和浅拷贝原型模式实例与解析实例一&#xff1a;邮件复制&#xff08;浅克隆&#xff09;实例二&#xff1a;邮件复制&#xff08;深克隆&#xff09; 模式动机 在面向对象系统中&#xff0c;使用原型模式来复制一个对象自…

人脸识别:Arcface--loss+code

之前只接触过传统方法的人脸识别算法&#xff0c;本以为基于深度学习的方法会使用对比损失之类的函数进行训练&#xff0c;但是Arcface算法基于softmax进行了创新&#xff0c;本文未深究其详细的loss公式原理&#xff0c;在大致明白其方向下&#xff0c;运行了代码&#xff0c;…

2024.4.2-[作业记录]-day07-CSS 盒子模型(显示模式、盒子模型)

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 作业 2024.4.2 学习笔记CSS标签元素显示模式1 块元素2 行内元素3 行内块元素4…

计算机组成结构—存储器概述

目录 一、存储器的分类 1.按存储介质分类 半导体存储器 磁性材料存储器 光盘存储器 2.按存取方式分类 随机存储器&#xff08;Random Access Memory&#xff0c; RAM&#xff09; 只读存储器&#xff08;Read Only Memory&#xff0c; ROM&#xff09; 串行访问存储器…

如何在iPhone上恢复永久删除的照片?

2007 年&#xff0c;Apple Inc. 推出了这款震撼人心的智能手机&#xff0c;后来被称为 iPhone。您会惊讶地发现&#xff0c;迄今为止&#xff0c;Apple Inc. 已售罄 7 亿台 iPhone 设备。根据 2023 年 8 月的一项调查数据&#xff0c;95% 的智能手机利润都落入了苹果公司的口袋…

下载页面上的视频

引言&#xff1a;有些页面上的视频可以直接右键另存为或者F12检索元素找到视频地址打开后保存&#xff0c;但有些视频页面是转码后的视频&#xff0c;不能直接另存为视频格式&#xff0c;可以参考下本方法 以该页面视频为例&#xff1a;加载中...点击查看详情https://wx.vzan.c…

#SOP#-如何使用AI辅助论文创作

#SOP#-如何使用AI辅助论文创作 ——2024.4.6 “在使用工具的时候&#xff0c;要做工具的主人” 最终交付物&#xff1a; 一份可执行的AI辅助创作论文的指导手册 交付物质量要求&#xff1a; 不为任何AI大模型付费&#xff01;不为任何降重网站付费&#xff01;通过知网检查论…

苍穹外卖08(地址簿功能,用户下单功能,订单支付全过程,内网穿透Cpolar)

目录 一、导入地址簿功能代码 1. 需求分析和设计 1 产品原型 2 接口设计 2. 代码导入 3. 功能测试 二、用户下单 1. 需求分析和设计 1 产品原型 2 接口设计 3 表设计 2. 代码开发 1 DTO设计 2 VO设计 3 开发代码 3. 功能测试 三、订单支付 1 微信支付介绍 1 …

Java 学习和实践笔记(51):二分法查找(折半检索)

二分法查找&#xff08;折半检索&#xff09;又叫binary search. 要在一堆数据中查找是否存在某一个已知数&#xff0c;二分法查找的步骤&#xff1a; 第一步&#xff0c;对数据实现排序 第二步&#xff0c;将该数与排序后的数据集的中间一个数进行比较 第三步&#xff0c;…

非关系型数据库(缓存数据库)redis的性能管理

目录 一.Redis性能管理 1.Info Memory——查看Redis内存使用 2.内存碎片率 3. 内存使用率 4.内存回收key 二.缓存的穿透&#xff0c;击穿和雪崩 1.缓存的穿透 1.1 问题描述 1.2 缓存穿透发生的条件 1.3 缓存穿透发生的原因 1.4 解决方案 2 缓存的击穿 2.1 问题描…

使用SVD将图像压缩四分之一(MATLAB)

SVD压缩前后数据量减少的原因在于&#xff0c;通过奇异值分解&#xff08;SVD&#xff09;&#xff0c;我们将原始数据&#xff08;如图像&#xff09;转换成了一种更加紧凑的表示形式。这种转换依赖于数据内部的结构和相关性&#xff0c;以及数据中信息的不均匀分布。 让我们…

以 2021inCTF-DeadlyFastGraph 入门 JSC利用

前言 最近一直在入门浏览器的利用&#xff0c;然后一直都在搞 V8&#xff0c;然后接触的比较多的都是一些混淆、越界的洞&#xff0c;希望后面可以入门 jit 然后在今年的阿里云 CTF 中看到了一道 jsc 相关的题目&#xff0c;当时本来想做一做的&#xff0c;但是环境一直没有搭…

vLLM介绍

vLLM是伯克利大学LMSYS组织开源的大语言模型高速推理框架&#xff0c;旨在极大地提升实时场景下的语言模型服务的吞吐与内存使用效率。vLLM是一个快速且易于使用的库&#xff0c;用于 LLM 推理和服务&#xff0c;可以和HuggingFace 无缝集成。vLLM利用了全新的注意力算法「Page…

ZKP价值链路的垂直整合

1. ZKP proof生命周期 从ZKP&#xff08;zero-knowledge proof&#xff09;生命周期&#xff0c;先看围绕ZKP的价值链路形成&#xff1a; 1&#xff09;User intent用户意图&#xff1a;以某用户意图为起点&#xff0c;如想要在某zk-rollup上swap某token、证明其身份、执行某…

java数据结构与算法刷题-----LeetCode405. 数字转换为十六进制数

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 分组位运算 分组位运算 这道题正常来说可以用转换7进制的思想来&…

加速度:电子元器件营销网站的功能和开发周期

据工信部预计&#xff0c;到2023年&#xff0c;我国电子元器件销售总额将达到2.1万亿元。随着资本的涌入&#xff0c;在这个万亿级赛道&#xff0c;市场竞争变得更加激烈的同时&#xff0c;行业数字化发展已是大势所趋。电子元器件B2B商城平台提升数据化驱动能力&#xff0c;扩…

算法学习18:动态规划

算法学习18&#xff1a;动态规划 文章目录 算法学习18&#xff1a;动态规划前言一、线性DP1.数字三角形&#xff1a;f[i][j] max(f[i - 1][j - 1] a[i][j], f[i - 1][j] a[i][j]);2.1最长上升子序列&#xff1a;f[i] max(f[i], f[j] 1);2.2 打印出最长子序列3.最长公共子序…

[从零开始学习Redis | 第九篇] 深入了解Redis数据类型

前言&#xff1a; 在现代软件开发中&#xff0c;数据存储和处理是至关重要的一环。为了高效地管理数据&#xff0c;并实现快速的读写操作&#xff0c;各种数据库技术应运而生。其中&#xff0c;Redis作为一种高性能的内存数据库&#xff0c;广泛应用于缓存、会话存储、消息队列…

MySQL - 基础三

11、事务管理 CURD不加控制&#xff0c;会有什么问题&#xff1f; 当客户端A检查还有一张票时&#xff0c;将票卖掉&#xff0c;还没有执行更新数据库时&#xff0c;客户端B检查了票数&#xff0c;发现大于0&#xff0c;于是又卖了一次票。然后A将票数更新回数据库。这是就出现…

09 flink-sql 中基于 mysql-cdc 的 select * from test_user 的具体实现

前言 这也是最近帮一个朋友看问题 遇到的一个问题 然后 引发了一下 对于 flink-sql 里面的一些 常规处理的思考, 理解 原始问题主要是 在测试库可以使用 flink-sql 可以正常同步, 但是 在生产环境 无法正常同步数据 这个问题 我们后面单独 记录一篇文章 测试用例 下载…