您的位置:首页 > 编程语言 > Python开发

python爬虫之2017政府工作报告词频统计

2017-03-15 19:12 375 查看

python爬虫之2017政府工作报告词频统计

工作报告获取

中文编码

数据清洗

字符分割统计

python编码中文显示问题

图表显示

文章内容

本文从网络抓取了2017年政府工作报告,并统计了各词语的出现频率,用图表分别显示了被提到超过30次和40次的词语。这里只是做了简单的分词,并没有对专业词汇、人名、数字、成语进行统计。所统计的词组全为两字词语。

说到网络爬虫,很多人都觉得是很炫的事,可以把自己关注的东西从海量数据中提取出来,海量数据扯得有点远。我们先来点现实的,本文所述爬虫是完全由我自己写的第一个爬虫程序,经历了很多痛苦。写下来的目的有两个,一是保存起来,为自己爬虫的第一次做个纪念,二是把其中的一些问题与大家交流,以免再次犯错。

废话不多说,先上代码。

@requires_authorization
from urllib.request import urlopen
from bs4 import BeautifulSoup
import re
import string
from collections import OrderedDict
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import mlab
from matplotlib import rcParams

def cleanInput(input):
input = re.sub('\n+'," ",input) #去除换行符
input = re.sub('\[[0-9]*\]',"",input) #去除带中括号的数字
input = re.sub('[0-9]',"",input) #去除数字
input = re.sub('[,。.、!:%;”“\[\]]',"",input) #去除中文标点符号
input = re.sub(' +', " ",input) #去除空格
input.strip(string.punctuation) #去除英文标点符号
return input

def getngrams(input, n):
input = cleanInput(input)
output = dict()
for i in range(len(input)-n+1):
newNGram = "".join(input[i:i+n]) #以指定字符串连接生成新的字符串
if newNGram in output:
output[newNGram] += 1 #如果字符出现过则加1
else:
output[newNGram] = 1 #没出现过则设置为1
return output

html = urlopen("http://news.ifeng.com/a/20170305/50754278_0.shtml")
bsObj = BeautifulSoup(html,"lxml")
content = bsObj.find("div",{"id":"main_content"}).get_text()
ngrams = getngrams(content,2)
ngrams = OrderedDict(sorted(ngrams.items(), key=lambda t: t[1], reverse=True))

datafile = open("2017report.txt",'w+')
count = []
count_label = []
for k in ngrams:
print("(%s,%d)" % (k,ngrams[k]))
datafile.write("(%s,%d)\n" % (k,ngrams[k]))
if(ngrams[k]> 30):
count.append(ngrams[k])
count_label.append(k)
x = np.arange(len(count))+1
fig1 = plt.figure(1)
rects =plt.bar(x,count,width = 0.5,align="center",yerr=0.001)
plt.title('2017政府工作报告词频统计')
def autolabel(rects):
for rect in rects:
height = rect.get_height()
plt.text(rect.get_x(), 1.03*height, '%s' % int(height))
autolabel(rects)
plt.xticks(x,count_label,rotation=90)
#plt.xticks(x,count_label)
plt.show()


部分代码给出了注释,如果有感兴趣的可以阅读《python网络数据采集》这本书,里面的爬虫代码参考自此书。

字符编码问题

从代码中可以看出,整个过程我并没有进行任何的编解码,那为什么我要提这个问题呢?我用的Visual studio Code编辑器写的代码。通过配置编辑器可以直接在里面运行,写完代码之后我确实也是这么干的。接下来的事情困扰了我两天。一开始我爬取的网页是gbk编码,这是中文页面常用的编码。当我输出页面内容时果然出问题了,一团乱码,然后我不断地尝试各种编码,解码。 后来我重新找了一个utf-8编码的网页,也是一样的问题,试了各种办法输出还是乱码,然后去加的一个python学习微信群里找答案,问了不少人,大家给出了各种答案,结果就是都不行。这已经超出编码的常理了。后来我一想会不会是编辑器本身的编码问题呢?然后我就在控制台运行了程序,果然是这样,一切都是那么完美,全部输出了中文,并且没有在代码里做任何的编码处理,正如你在上面代码中看到的一样。好了,问题终于解决了,就是编辑器的编码问题。这里附上一篇vs code编码问题的解决方案。http://jingyan.baidu.com/article/ab0b563080d1a5c15afa7da1.html

结果显示



图片显示是政府工作报告中被提到超过30次的词语



图片显示是政府工作报告中被提到超过40次的词语

可以看出,“发展”和“改革”始终是主题,“推进经济建设”是我们持续不变的目标。“人民”“国家”“就业”“创新”等词也是政府关注的重点。

代码中并没有对一些明显不是词语词组和意思相近的词组做删除和合并,这涉及到更宽广的内容,暂时不做处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 编解码 爬虫