文章目录

  • 一、确定整体思路
  • 二、实际操作部分
    • 1、爬取人民日报的数据
    • 2、整理爬取的数据
    • 3、统计关键词的出现次数
    • 4、后续操作

“语象观察”是之前看过的钱钢老师做的一项社会学研究,由于之前用于发布的“尽知天下事”公众号被封,导致目前无法再看到老师的相关研究成果(或许这个项目已经停止了),便有了自己尝试来研究。
钱钢老师的文章示例:https://sourl.cn/idh34d

一、确定整体思路

二、实际操作部分

作为技术初学者(和小白差不多),所有的操作都是以目的为导向,并不追求操作的完美型,只求在最少涉及技术的情况下实现要求。

本次所用程序主要由python实现。(python3.8,windows 10 环境下进行的测试)

1、爬取人民日报的数据

此处特别感谢CSDN用户@机灵鹤的博客文章,我在他的代码上进行了一丢丢的更改,直接上代码

import requests
import bs4
import os
import datetime
import timedef fetchUrl(url):'''功能:访问 url 的网页,获取网页内容并返回参数:目标网页的 url返回:目标网页的 html 内容'''headers = {'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8','user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',}r = requests.get(url,headers=headers)r.raise_for_status()r.encoding = r.apparent_encodingreturn r.textdef getPageList(year, month, day):'''功能:获取当天报纸的各版面的链接列表参数:年,月,日'''url = 'http://paper.people.com.cn/rmrb/html/' + year + '-' + month + '/' + day + '/nbs.D110000renmrb_01.htm'html = fetchUrl(url)bsobj = bs4.BeautifulSoup(html,'html.parser')temp = bsobj.find('div', attrs = {'id': 'pageList'})if temp:pageList = temp.ul.find_all('div', attrs = {'class': 'right_title-name'})else:pageList = bsobj.find('div', attrs = {'class': 'swiper-container'}).find_all('div', attrs = {'class': 'swiper-slide'})linkList = []for page in pageList:link = page.a["href"]url = 'http://paper.people.com.cn/rmrb/html/'  + year + '-' + month + '/' + day + '/' + linklinkList.append(url)return linkListdef getTitleList(year, month, day, pageUrl):'''功能:获取报纸某一版面的文章链接列表参数:年,月,日,该版面的链接'''html = fetchUrl(pageUrl)bsobj = bs4.BeautifulSoup(html,'html.parser')temp = bsobj.find('div', attrs = {'id': 'titleList'})if temp:titleList = temp.ul.find_all('li')else:titleList = bsobj.find('ul', attrs = {'class': 'news-list'}).find_all('li')linkList = []for title in titleList:tempList = title.find_all('a')for temp in tempList:link = temp["href"]if 'nw.D110000renmrb' in link:url = 'http://paper.people.com.cn/rmrb/html/'  + year + '-' + month + '/' + day + '/' + linklinkList.append(url)return linkListdef getContent(html):'''功能:解析 HTML 网页,获取新闻的文章内容参数:html 网页内容'''bsobj = bs4.BeautifulSoup(html,'html.parser')# 获取文章 标题title = bsobj.h3.text + '\n' + bsobj.h1.text + '\n' + bsobj.h2.text + '\n'#print(title)# 获取文章 内容pList = bsobj.find('div', attrs = {'id': 'ozoom'}).find_all('p')content = ''for p in pList:content += p.text + '\n'#print(content)# 返回结果 标题+内容resp = title + contentreturn respdef saveFile(content, path, filename):'''功能:将文章内容 content 保存到本地文件中参数:要保存的内容,路径,文件名'''# 如果没有该文件夹,则自动生成if not os.path.exists(path):os.makedirs(path)# 保存文件with open(path + filename, 'w', encoding='utf-8') as f:f.write(content)def download_rmrb(year, month, day, destdir):'''功能:爬取《人民日报》网站 某年 某月 某日 的新闻内容,并保存在 指定目录下参数:年,月,日,文件保存的根目录'''pageList = getPageList(year, month, day)for page in pageList:titleList = getTitleList(year, month, day, page)for url in titleList:# 获取新闻文章内容html = fetchUrl(url)content = getContent(html)# 生成保存的文件路径及文件名temp = url.split('_')[2].split('.')[0].split('-')pageNo = temp[1]titleNo = temp[0] if int(temp[0]) >= 10 else '0' + temp[0]path = destdir + '/' + year + month + day + '/'fileName = year + month + day + '-' + pageNo + '-' + titleNo + '.txt'# 保存文件saveFile(content, path, fileName)def gen_dates(b_date, days):day = datetime.timedelta(days = 1)for i in range(days):yield b_date + day * idef get_date_list(beginDate, endDate):"""获取日期列表:param start: 开始日期:param end: 结束日期:return: 开始日期和结束日期之间的日期列表"""start = datetime.datetime.strptime(beginDate, "%Y%m%d")end = datetime.datetime.strptime(endDate, "%Y%m%d")data = []for d in gen_dates(start, (end-start).days):data.append(d)return dataif __name__ == '__main__':'''主函数:程序入口'''# 输入起止日期,爬取之间的新闻beginDate = input('请输入开始日期:') # 日期格式20200101endDate = input('请输入结束日期:')data = get_date_list(beginDate, endDate)for d in data:year = str(d.year)month = str(d.month) if d.month >=10 else '0' + str(d.month)day = str(d.day) if d.day >=10 else '0' + str(d.day)destdir = "E:/date"  #此处选择爬取下来文件的存储路径download_rmrb(year, month, day, destdir)print("爬取完成:" + year + month + day)
#         time.sleep(3)        # 怕被封 IP 爬一爬缓一缓,爬的少的话可以注释掉
# 不建议一次爬取太多天的数据,如果报错,可能是被封ip,稍等一会再进行即可

2、整理爬取的数据

第一步爬虫爬下来的是将每天所有文章保存在一个文件夹下,需要将所有文章合并为一个txt文件。

此处代码感谢CSDN用户@yunzifengqing的博客文章

# 本知识来源于:https://sourl.cn/LR2N5W
# 本程序支持合并文件夹及其子文件中txt的合并import os# 运行Python过程中输入文件夹路径及合并后的文件路径及名称
# rootdir = raw_input("the old path: ")
# newfile = raw_input("the new path and filename: ")
rootdir = r'E:\date'   # 输入需要合并文件的文件夹路径
newfile = r'E:\date\合并后文档.txt'  # 输入合并后文件的存储路径
paths = []   # 存放文件夹(含子文件夹)下所有文件的路径及名称# 获取文件夹(含子文件夹)下所有文件的路径及名称
for root, dirs, files in os.walk(rootdir):for file in files:paths.append(os.path.join(root, file).encode('utf-8')) # 支持中文名称# 创建新的文件
f = open(newfile,'w',encoding='utf-8')
# 将之前获取到的文件夹(含子文件夹)下所有文件的路径及名称里的内容写进新建的文件里
for i in paths:for line in open(i,encoding='utf-8'):f.writelines(line)
f.close()   # 保存并关闭新建的文件

3、统计关键词的出现次数

搜索关键词虽是日常生活中最常用到的操作,但是花费是精力是最大的。由于合并后文本的字数非常大,且需要搜索的关键词很多,如果是通过软件搜索那工作量太大了,此外网上有很多的python搜索关键词的代码,但是大多是需要我在程序中输入需要搜索的关键词,不适合关键词很多的情况。

此外,作为python小白,之前走错路查了非常多的自然语言处理,但是最后还是查找资料找到了想要的程序。


实现此项目的首先需要创建关键词文件,这个根据具体需要进行更换,关键词的整理或许还需要爬虫的支持,我暂时还未涉及,如果不多可以手动输入。还有为了考虑项目的实际需要,选择在程序中指定关键词和文本路径,以便减少后续操作的更改量。

此代码统计次数部分感谢B站用户@Deustchlands的视频,关键次文件和需统计文本的路径知识感谢CSDN用户@Scarlett2045的博客文章,将统计结果输出为csv文件知识感谢CSDN用户@Aaran123的博客文章,还很感谢无数网友的乐于分享帮助解决了很多问题。

注意:
1、with open()里的路径是‘\’,Excel = open()里的路径是‘/
2、关键词名单为txt文件,每个关键词为一行。
3、本程序其实具有两个部分,打印出统计结果,和输出有统计结果的csv文件
4、倒数第三行和第七行中的数字分别代表打印和输出排名的前多少位,输出的排名必需小于或等于可以输出的排名,例如10个关键词只有7个出现过可以被搜到,那输出的排名智只能小于等于7。

# 本知识来源:https://www.bilibili.com/video/BV1ue411s7Gv
#  https://github.com/Ericwang6/three_body
# https://sourl.cn/jKeQYH      https://sourl.cn/cDP8HRimport jieba
import csv# 打开准备好的关键词名单
with open(file=r"E:\OneDrive\projects\语象观察—人民日报\相关代码\词频统计\中国政要名单.txt",encoding='UTF-8') as f:nameList = f.read().split('\n')# 打开要进行词频统计的文本
with open(file=r"E:\date\合并后文档.txt",encoding='UTF-8') as f:txt = f.read()# 向jieba库中加入人名,防止jieba在分词时将人名当作两个词拆分掉
for name in nameList:jieba.add_word(name)# 打开表格文件,若表格文件不存在则创建
# 输出的文件路径也是可以设置的,和之前的修改估计一样
# 直接输入要存入的路径即可,不过路径中不是“\”而是“/”
Excel = open("E:/date/本月中国政要出现次数.csv", 'w', newline='')
writ = csv.writer(Excel)  # 创建一个csv的writer对象用于写每一行内容
writ.writerow(['名称', '出现次数'])  # 写表格表头# 分词
txt = jieba.lcut(txt)# 创建一个字典,用于对词出现次数的统计,键表示词,值表示对应的次数
counts = {}
for item in txt:for name in nameList:if item == name:counts[name] = counts.get(name, 0) + 1  # 在字典中查询若该字返回次数加一# 排序并输出结果
count = sorted(counts.items(), key=lambda kv: kv[1], reverse=True)
for item in count[:20]:  # 选择打印输出前多少的数据print(item)  # 会显示在控制面板上,但不会保存到本地item = list(counts.items())  # 将字典转化为列表格式
item.sort(key=lambda x: x[1], reverse=True)  # 对列表按照第二列进行排序
for i in range(5):   # 要确保设置导出的数小于等于可以导出数的最大值writ.writerow(item[i])  # 将前几名写入表格,
print('统计结果输出成功')

4、后续操作

如果想要全自动,可以直接将这几段代码按顺序合并在一起,便能自动执行相应的功能。

在输出统计结果之后,可以按照自己的需求进行相应操作。可视化和社科研究就不在这里考虑了。


我已经将爬取下来的原始数据按月份分类上传到github仓库中了,欢迎访问。https://github.com/caspiankexin/people-daily-crawler-date

“语象观察”-爬取人民日报并统计词频相关推荐

  1. 易语言词达人爬取题库

    易语言词达人爬取题库 易语言词达人爬取题库 用到了奇易模块 首先开启FD代理 接下来是子程序 实操: 进入单词界面之后,选择单词 这里就已经抓取到题库了,我只是提供一个思路 当然不可能每一个单词都这样 ...

  2. Python :爬取人民日报新闻

    引用部分内容:https://blog.csdn.net/wenxuhonghe/article/details/90047081 其实我只是因为在那边评论区想评论,然后发现位置不够,所以才打算写这个 ...

  3. 爬取人民日报_【爬虫项目】人民日报

    爬虫目标 指定日期,爬取人民日报所有版面的新闻 简要分析版面链接分析 发现一共有20个版面,分别有 20 个链接,只是每个链接后的数字不同 http://paper.people.com.cn/rmr ...

  4. 爬取人民日报_scrapy爬虫爬取新闻入坑第一课

    话不多说先上代码:爬取人民日报 下面一步一步的介绍整个scrapy的架构 首先我们要先下载scrapy框架,这里解释一下框架和库的区别:框架是一种有别于软件,但是面向开发者的一种工具,是一种产品的形式 ...

  5. 每日10行代码31:爬取人民日报一日的所有文章并存入数据库

    今天又增加了存入数据库的功能,至此,爬取人民日报的项目已经结束,下一步我将跟另一篇文章的博主比较下代码,从他那学一些有用的东西. import requests import re from bs4 ...

  6. Python爬虫练习五:爬取 2017年统计用区划代码和城乡划分代码(附代码与全部数据)

    本文仅供学习,需要数据的文末有链接下载,请不要重复爬取. 最近工作中,因为统计用区划代码和城乡划分代码更新了最新的2017版,需要爬取最新的数据.于是乎,本次花了一定精力,将整个2017版数据完完整整 ...

  7. 爬取人民日报_【爬虫系列】人民日报半个世纪的资料(文末福利)

    在资料库中人民日报从1957年-2002年近半个世纪的报纸资料: http://www.ziliaoku.org/rmrb/ 如此好的资料,就应该自己收藏到本地,因为说不定哪一天,网上的资料就被删除了 ...

  8. python 爬虫爬取统计局北京统计数据

    python 爬虫爬取统计局统计数据 写在前面 主要因为朋友写论文,要爬取北京的经济数据.拜托我写一个爬虫爬取数据.爬取的都是公开的数据,代码仅供学习使用,切勿用作非法. http://tjj.bei ...

  9. 爬取人民日报评论版面文章

    因为在准备公务员考试,想着把人民日报评论版面看看,奈何这个app不好用,遂有了自己爬虫的念想,在csdn上搜索了下,这里记录下,感谢CSDN博主「机灵鹤」的原创文章. ---------------- ...

最新文章

  1. UVa573 The Snail
  2. 使用dynamic特性处理XML文档
  3. java基本类型的默认值及其取值范围
  4. 【转】设置Win32窗口背景颜色
  5. java隐含转化_java中自动转换和强制转换还有隐含转换
  6. ElasticSearch核心基础之入门篇
  7. 身份认证之多因素身份认证(MFA)
  8. December in English(2017)
  9. meta http-equiv=“X-UA-Compatible“ content=““ 的作用
  10. springboot+vue医院预约挂号系统java
  11. 善于计划,善于总结,善于归纳
  12. 单元格内容分列多行_『如何将excel单个表格里的多行数据分列』
  13. layui+croppers完成图片剪切上传
  14. mail 使用QQ邮箱
  15. 铸造工艺问题6——砂型涂料多厚,刷几次?芯头斜度?新旧砂的作用树脂、固化剂的作用
  16. access vba代码大全_这本VBA经典图书终于做活动了,还是5折!
  17. Jmeter beanshell语法
  18. 服务器终端授权,终端服务器许可 - Windows Server | Microsoft Docs
  19. Python的文件操作,open、with open
  20. 计算机网络1255,国家开放大学电大本科《计算机网络》2024期末试题及答案(试卷号:1255).docx...

热门文章

  1. 【机器学习】专题学习丨1. 损失函数loss积累丨
  2. 谁拿了奖金?HID2020竞赛、研讨会及颁奖典礼
  3. PAT_甲级 简单模拟
  4. 2023年,莫荒废了时光。
  5. html如何调用短视频文件,短视频脚本怎么写?3种短视频脚本的创意写作方法干货分享!...
  6. 【一些题目】CTF Crypto初接触
  7. PHP后端连接数据库插入数据
  8. 刺激战场国际服服务器如何修改,刺激战场国际服如何更改自己的苹果id地区-无需购买海外id...
  9. C语言程序设计作业04
  10. Codeforces Round #703 (Div. 2)C1C2 Guessing the Greatest(二分)