前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python | 爬取农业农村部政策法规并绘制词云图

Python | 爬取农业农村部政策法规并绘制词云图

作者头像
PyStaData
发布2020-07-21 10:57:54
3.2K1
发布2020-07-21 10:57:54
举报
文章被收录于专栏:PyStaDataPyStaData

前言

本文用作准备课堂分享,我们小组选的主题是产业融合,我负责第一部分背景。因为产业融合的政策性较强,为了更生动地展示政策文件内容,就爬取了农业农村部专题网站[1]上的政策法规,并基于 TF-IDF 算法提取关键词、统计词频和绘制词云图,以便丰富展示素材。

爬取政策法规

爬取政策列表

代码语言:javascript
复制
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

爬取政策文本

细心的读者会发现,上图政策法规列表中还包括创业创新的内容,如果一并抓取会影响分析结果的准确性。因此,仅选取产业融合相关的政策文件,并爬取政策文本。

代码语言:javascript
复制
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 文件。

代码语言:javascript
复制
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)

分词与统计

文本预处理

代码语言:javascript
复制
# 去除多余字符
f = open('所有政策文件.txt', "r", encoding="utf-8")
t = f.read()
f.close()
t = re.sub(r'\d+', "", t)  # 去除所有数字

分词

代码语言:javascript
复制
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)

提取关键词

代码语言:javascript
复制
# 基于TF-IDF算法提取关键词
kw = " ".join(analyse.extract_tags(t, topK=20, withWeight=False, allowPOS=()))
print("三产融合相关政策中前20个关键词:\n", kw)

'''
三产融合相关政策中前20个关键词:
融合 农村 农业 产业 发展 农产品 返乡 创业 试点 支持 \
一二三 下乡 创新 农民 推进 休闲 示范 加工 乡村 人员
'''

词频统计

代码语言:javascript
复制
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')

绘制词云图

静态词云图

代码语言:javascript
复制
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()

动态词云图

代码语言:javascript
复制
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/

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PyStaData 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 爬取政策法规
    • 爬取政策列表
      • 爬取政策文本
      • 分词与统计
        • 文本预处理
          • 分词
            • 提取关键词
              • 词频统计
              • 绘制词云图
                • 静态词云图
                  • 动态词云图
                    • 参考资料
                • 小结
                相关产品与服务
                腾讯云图数据可视化
                腾讯云图数据可视化(Tencent Cloud Visualization) 是一站式数据可视化展示平台,旨在帮助用户快速通过可视化图表展示大量数据,低门槛快速打造出专业大屏数据展示。精心预设多种行业模板,极致展示数据魅力。采用拖拽式自由布局,全图形化编辑,快速可视化制作。腾讯云图数据可视化支持多种数据来源配置,支持数据实时同步更新,同时基于 Web 页面渲染,可灵活投屏多种屏幕终端。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档