当前位置:   article > 正文

爬虫 红网时刻 获取当月指定关键词新闻 并存储到CSV文件

爬虫 红网时刻 获取当月指定关键词新闻 并存储到CSV文件

目标网站:红网

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

环境:Pycharm2021,Python3.10,

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

代码如下:(代码中附详细解析)

后续会不断完善,会出界面版,提高大家易用性;同时修改完善代码,设置为可指定获取的时间段的新闻稿。也会陆续更新其他新闻平台的新闻获取爬虫。

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # @Time : 2024/3/25 23:05
  4. # @Author : LanXiaoFang
  5. # @Site :
  6. # @File : redNet.py
  7. # @Software: PyCharm
  8. import csv
  9. import requests
  10. from bs4 import BeautifulSoup
  11. import datetime
  12. header = {
  13. 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
  14. 'Accept - Encoding': 'gzip, deflate, br',
  15. "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",
  16. 'Connection': "keep - alive",
  17. 'Referer': 'https://news-search.rednet.cn/Search?q=%E5%8F%8C%E7%89%8C',
  18. 'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0",
  19. "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",
  20. "Upgrade-Insecure-Requests": "1",
  21. }
  22. def get_all_indexes(s, char):
  23. return [i for i, c in enumerate(s) if c == char]
  24. # 获取系统时间
  25. now = datetime.datetime.now()
  26. year = now.year # 年
  27. month = now.month # 月
  28. day = now.day # 日
  29. # 创建CSV文件并写入头部信息
  30. with open(str(month) + 'MTitleSP.csv', 'w', newline='', encoding='utf-8') as csvfile:
  31. writer = csv.writer(csvfile)
  32. writer.writerow(['序号', '新闻名称', '新闻来源', '媒体级别', '发布日期', '原文链接']) # 根据实际情况定义列名
  33. with open(str(month) + 'MTitleNSP.csv', 'w', newline='', encoding='utf-8') as csvfile:
  34. writer = csv.writer(csvfile)
  35. writer.writerow(['序号', '新闻名称', '新闻来源', '媒体级别', '发布日期', '原文链接']) # 根据实际情况定义列名
  36. article_no_sp = 1 # 用于计在标题含指定区域的存储的表中的数据的序号
  37. article_no = 1 # 用于计在标题不含但内容含指定区域的存储的表中的数据的序号
  38. get_go = 0 # 获取第几页开始的数据,现在是0开始
  39. count = 0 # 用于计算总共爬取的新闻数量
  40. area = '双牌' # 爬取指定区域的文章
  41. # 相当于满足条件就是一直循环
  42. while get_go >= 0:
  43. url = 'https://news-search.rednet.cn/Search?q=%E5%8F%8C%E7%89%8C&s=0&o=1&r=0&p=' + str(get_go)
  44. print(url)
  45. html = requests.get(url, headers=header)
  46. html.encoding = 'utf-8'
  47. get_go += 1
  48. if html.status_code == 200:
  49. soups = BeautifulSoup(html.text, 'html.parser')
  50. article_info = soups.find_all('div', class_='result')
  51. # print(len(article_info), '\n')
  52. for i in article_info:
  53. result_info = i.find_all('div', class_='result-info')
  54. station_source = result_info[0].select('span') # 选择result_info下的所有span标签
  55. station_info = station_source[0].text # 文章发布站点
  56. source_info = station_source[1].text # 文章来源
  57. print(station_info, source_info)
  58. # print(i.find_all('div', class_='title'), '\n')
  59. title_info = i.find_all('div', class_='title')
  60. # 文章链接
  61. article_href = title_info[0].a.get('href')
  62. if station_info[3:] == area + "新闻网":
  63. # print("双牌新闻网文章链接:", article_href, "---------", "https://moment.rednet.cn/pc" + article_href[22:])
  64. article_href = "https://moment.rednet.cn/pc" + article_href[22:]
  65. # 修改文章来源为红网时刻
  66. if 'rednet' in article_href:
  67. source_info = "红网"
  68. if 'moment.rednet' in article_href:
  69. source_info = "红网时刻"
  70. if '来源' in source_info:
  71. source_info = station_info[3:]
  72. # 文章标题
  73. article_title = title_info[0].h3.text
  74. # 获取发布时间
  75. article_up_time = title_info[0].span.text
  76. # 把显示为进入和昨天的时间,改为具体的日期
  77. if article_up_time == '今天':
  78. article_up_time = str(year) + '.' + str(month) + '.' + str(day)
  79. elif article_up_time == '昨天':
  80. article_up_time = str(year) + '.' + str(month) + '.' + str(day - 1)
  81. # 修改时间显示格式,-替换为.
  82. else:
  83. # article_up_time = article_up_time[:4] + '.' + article_up_time[5:7] + '.' + article_up_time[8:10] + '.'
  84. article_up_time = article_up_time.replace('-', '.')
  85. count += 1
  86. print(count, '----新闻名称', article_title, '文章来源', source_info, '发布日期', article_up_time, '原文链接',
  87. article_href)
  88. # 得到这篇文章发布的月份
  89. all_index = get_all_indexes(article_up_time, '.')
  90. article_up_time_month = article_up_time[all_index[0] + 1:all_index[1]]
  91. # 只要本月的,如果获取到的文章是本月之前的则不再获取,退出循环
  92. if int(article_up_time_month) < month:
  93. print('已经不是这个月的啦', int(article_up_time_month), month)
  94. get_go = -1
  95. break
  96. # 把数据存入表格 根据标题是否含有双牌两个字 分开存储
  97. if area in article_title:
  98. # 这个是标题含有双牌的
  99. with open(str(month) + 'MTitleSP.csv', 'a', newline='', encoding='utf-8') as csvfile:
  100. writer = csv.writer(csvfile)
  101. writer.writerow([article_no_sp, article_title, source_info, '省级', article_up_time, article_href])
  102. article_no_sp += 1
  103. else:
  104. # 这个是标题不含但是内容含有双牌的
  105. with open(str(month) + 'MTitleNSP.csv', 'a', newline='', encoding='utf-8') as csvfile:
  106. writer = csv.writer(csvfile)
  107. writer.writerow([article_no, article_title, '省级', source_info, article_up_time, article_href])
  108. article_no += 1

由于现在是2024年4月1日 13:04,文章更新的本月的不多。

运行结果如下:

  

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/355447?site
推荐阅读
相关标签
  

闽ICP备14008679号