Python | 爬取农业农村部政策法规并绘制词云图
时间:2022-07-22
本文章向大家介绍Python | 爬取农业农村部政策法规并绘制词云图,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前言
本文用作准备课堂分享,我们小组选的主题是产业融合,我负责第一部分背景。因为产业融合的政策性较强,为了更生动地展示政策文件内容,就爬取了农业农村部专题网站[1]上的政策法规,并基于 TF-IDF 算法提取关键词、统计词频和绘制词云图,以便丰富展示素材。
爬取政策法规
爬取政策列表
import requests
from bs4 import BeautifulSoup
import re
import numpy as np
import pandas as pd
import os
url = "http://www.moa.gov.cn/ztzl/scw/zcfgnc/"
html = requests.get(url)
html.encoding = 'utf-8'
soup = BeautifulSoup(html.text, 'lxml')
# 存储获取政策名称、链接和发布日期
policies = soup.find_all('li', 'li_cir')
title = [policies[i].find('a')['title'] for i in range(len(policies))]
links = [url + policies[i].find('a')['href'][2:] for i in range(len(policies))]
date = [re.sub("n|s", "", policies[i].find('span', 'date fr dc_3').text)
for i in range(len(policies))]
# 结果导出为 CSV
info = pd.DataFrame([title, links, date]).T
info.columns = ['文件名称', '链接', '发布日期']
info.to_csv("01_产业融合政策列表.csv", index=None, encoding='utf-8-sig')
info
爬取政策文本
细心的读者会发现,上图政策法规列表中还包括创业创新的内容,如果一并抓取会影响分析结果的准确性。因此,仅选取产业融合相关的政策文件,并爬取政策文本。
for i in range(len(policies)):
link = links[i]
file_name = title[i].strip() + ".txt"
if "产业融合" in file_name:
print("爬取:", file_name)
r = requests.get(link)
r.encoding = 'utf8'
soup = BeautifulSoup(r.text, 'lxml')
contents = soup.find(
'div', attrs={'class': 'arc_body mg_auto w_855 pd_b_35'}).find_all('p')
with open(file_name, 'wb') as f:
for content in contents:
f.write(content.get_text().strip().encode())
'''
爬取: 农村一二三产业融合助力乡村振兴.txt
爬取: 农业农村部关于实施农村一二三产业融合发展推进行动的通知.txt
爬取: 国务院办公厅关于支持返乡下乡人员创业创新促进农村一二三产业融合发展的意见.txt
爬取: 关于印发农村产业融合发展试点示范方案的通知.txt
爬取: 国务院办公厅关于推进农村一二三产业融合发展的指导意见.txt
爬取: 中国农业银行关于做好农村一二三产业融合发展金融服务的意见.txt
爬取: 农村一二三产业融合发展推进工作方案.txt
'''
经过前一步,已经完成单个政策文件的爬取,接下来,将其合并为一个 txt 文件。
filenames = os.listdir()
txt_files = [f for f in filenames if f.split('.')[-1] == "txt"]
txt_content = []
for txt_file in txt_files:
with open(txt_file, encoding='utf8') as f:
txt_content = txt_content + f.readlines()
with open("所有政策文件.txt", 'w', encoding="utf8") as result:
result.writelines(txt_content)
分词与统计
文本预处理
# 去除多余字符
f = open('所有政策文件.txt', "r", encoding="utf-8")
t = f.read()
f.close()
t = re.sub(r'd+', "", t) # 去除所有数字
分词
import jieba
import jieba.analyse as analyse
# 分词和去除停用词
ls = jieba.lcut(t)
stopwords = [line.strip() for line in open(
'./requirement/user_dict.txt', 'r', encoding='utf-8').readlines()]
words = [word for word in ls
if len(word) > 1
and word not in stopwords
and not re.match('^[a-z|A-Z|0-9|.]*$', word)]
txt = " ".join(words)
提取关键词
# 基于TF-IDF算法提取关键词
kw = " ".join(analyse.extract_tags(t, topK=20, withWeight=False, allowPOS=()))
print("三产融合相关政策中前20个关键词:n", kw)
'''
三产融合相关政策中前20个关键词:
融合 农村 农业 产业 发展 农产品 返乡 创业 试点 支持
一二三 下乡 创新 农民 推进 休闲 示范 加工 乡村 人员
'''
词频统计
counts = {}
for word in words:
if len(word) == 1:
continue
else:
counts[word] = counts.get(word, 0) + 1
items = list(counts.items())
items.sort(key=lambda x: x[1], reverse=True)
# 导出词频结果
df = pd.DataFrame(items, columns=['关键词', '频次'])
df.to_csv("02_词频统计结果.csv", index=None, encoding='utf_8_sig')
绘制词云图
静态词云图
import wordcloud
import matplotlib.pyplot as plt
# 绘制词云图
w = wordcloud.WordCloud(font_path="./requirement/simhei.ttf",
width=1000, height=700, background_color="black")
w.generate(txt)
w.to_file("03_政策法规词云图.png")
# 展示结果
fig = plt.figure(figsize=(20, 100))
plt.imshow(w, interpolation='bilinear')
plt.axis("off")
plt.show()
动态词云图
from pyecharts import options as opts
from pyecharts.charts import Page, WordCloud
from pyecharts.globals import SymbolType
def wordcloud_diamond() -> WordCloud:
words = items
c = (
WordCloud()
.add("", words, word_size_range=[20, 100], shape=SymbolType.DIAMOND)
.set_global_opts(title_opts=opts.TitleOpts(title="农村产业融合政策法规词云图"))
)
return c
wordcloud_diamond().render('04_农村产业融合政策法规词云图.html')
wordcloud_diamond().render_notebook()
小结
从分析结果可以看出农村产业融合主要围绕“三农”问题。强调以农业为基本依托,通过产业间交叉、渗透和重组,推进一二三产业前后联动、要素集聚和跨界配置,从而解决农民就业问题、人才问题和农业创新等问题。需要说明的是,专题网站提供与产业融合相关的政策法规并不完全,这会影响结论的准确性。
参考资料
[1]
农业农村部专题网站: http://www.moa.gov.cn/ztzl/scw/
- HDUOJ---1996汉诺塔VI
- HDUOJ---(1995)汉诺塔V
- HDUOJ----(2612)Find a way
- HDUOJ----2512一卡通大冒险
- HDUOJ------(1230)火星A+B
- nyoj-----前缀式计算
- HDUOJ----(4788)Hard Disk Drive
- NYOJ-------笨蛋难题四
- Win平台Web访问白名单设置脚本(IP安全性原则)
- NYOJ-------表达式求值
- HDUOJ----1181 变形课
- 正确的Win主机网站伪静态设置方法
- HDUOJ----(1084)What Is Your Grade?
- HDUOJ------(1272)小希的迷宫
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 字符串:听说你对KMP有这些疑问?
- C++ gflags库使用说明
- 字符串:KMP算法还能干这个!
- Day12 :数值的整数次方
- 字符串:前缀表不右移,难道就写不出KMP了?
- HTTP请求头referer
- 【干货】C++基础知识:继承与派生详解
- 文本相似度——编辑距离
- 文本相似度——汉明距离
- python函数——Bunch配置加载
- npm install、npm install --global、npm install --save、npm install --save-dev的区别
- 3种 Springboot 全局时间格式化方式,别再写重复代码了
- pip conda 安装速度慢解决方法
- Linux 中指定使用的GPU
- 未读消息(小红点),前端 与 RabbitMQ 实时消息推送实践,贼简单~