1、以人民网的新闻数据为例,简单介绍的利用python进行爬虫,并生成词云图的过程。
首先介绍python的requests库,它就好像是一个“爬手”,负责到用户指定的网页上将所需要的内容爬取下来,供之后的使用。
我们可以利用python的pip功能下载requests库,在cmd窗口输入pip install requests命令进行安装,之后用到的库也使用这种方法下载(由于我已经安装了,所以显示已经存在)。
下载后之后会存在lib\site-packages目录下。
2、接下来我们就可以使用requests爬取网页了。
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) '
'AppleWebKit/537.36 (KHTML, like Gecko)'
' Chrome/55.0.2883.87 Safari/537.36'} # 请求头部可到相应网页中查找
url = 'http://www.people.com.cn/'
r = requests.get(url, headers=headers)
requests.get()中含有两个参数,分别为url与headers。
url表示用户需要爬取的网页链接。请求头header提供了关于请求、响应或其他发送实体的信息(如果没有请求头或请求头与实际网页不一致,就可能无法爬取内容)。
以人民网为例,演示如何获取headers。
打开http://www.people.com.cn/(人民网网址),按F12打开开发人员工具。选择Network选项卡,之后刷新页面。在左侧查找到我们的网页,点击后右边将显示headers内容。需要使用到其中的user-agent,复制其中的内容作为请求头headers。
我们将爬取的网页内容复制给r,只需要输出r.text就可以在python的IDE里查看网页内容了。
3、网页中不是所有内容都对我们有帮助的,所以需要对它进行解析与内容提取,在这个过程中我们使用Beautifulsoup方法解析。
在本例中想要爬取网页上的新闻标题,点击人民网查看网页的源代码。
发现标题都在class=“list14”的ul的列表里。于是,我们使用find_all方法提取所有class=“list14”的ul列表内容。
soup = BeautifulSoup(r.text, "html.parser")
for news_list in soup.find_all(class_="list14"):
content = news_list.text.strip()
4、为了使用方便,我们将爬取的内容存在txt文本中,接下来,需要读取文本进行词频统计。
jieba库根据自己的词库对文本数据进行切分,并统计之后将词频返回给开发者。
我们利用一个字典keywords来存下切分后的关键字及词频。
coco = open('renming.txt', encoding="utf-8").read() # 读取文件
result = jieba.analyse.textrank(coco, topK=50, withWeight=True) # 词频分析
keywords = dict()
for i in result:
keywords[i[0]] = i[1]
5、经常利用python绘制图表的朋友可能会了解wordcloud库,帮助开发者根据词频进行绘图,并且可以人性化地设置字体颜色等等。
wc = WordCloud(font_path='./fonts/simhei.ttf', background_color='White', max_words=50)
wc.generate_from_frequencies(keywords)
词云图的样式默认为正方形,可以通过np.array等操作进行设置,修改样式(具体实现可参考完整代码注释部分)。
6、最后为了代码的简洁美观,将上述代码封装成函数,完整代码如下。
# coding:utf-8
import requests
from bs4 import BeautifulSoup
import jieba.analyse
import matplotlib.pyplot as plt
from PIL import Image,ImageSequence
import numpy as np
from wordcloud import WordCloud
def spider(url,headers):
with open('renming.txt', 'w', encoding='utf-8') as fp:
r = requests.get(url, headers=headers)
r.encoding = 'gb2312'
# test=re.findall('<li><a href=.*?>(.*?)</a></li>',r.text)#利用正则进行解析
# print(test)
soup = BeautifulSoup(r.text, "html.parser")
for news_list in soup.find_all(class_="list14"):
content = news_list.text.strip()
fp.write(content)
fp.close()
def analyse():
coco = open('renming.txt', encoding="utf-8").read() # 读取文件
result = jieba.analyse.textrank(coco, topK=50, withWeight=True) # 词频分析
keywords = dict()
for i in result:
keywords[i[0]] = i[1]
print(keywords)
wc = WordCloud(font_path='./fonts/simhei.ttf', background_color='White', max_words=50)
wc.generate_from_frequencies(keywords)
# image = Image.open('./reqiqiu.jpg') # 生成云图,设置样式
# graph = np.array(image)
# wc = WordCloud(font_path='./fonts/simhei.ttf', background_color='White', max_words=50, mask=graph)
# wc.generate_from_frequencies(keywords)
# image_color = ImageColorGenerator(graph)
plt.imshow(wc)
plt.axis("off")
plt.show()
wc.to_file('dream.png')
if __name__=="__main__":
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) '
'AppleWebKit/537.36 (KHTML, like Gecko)'
' Chrome/55.0.2883.87 Safari/537.36'} # 请求头部可到相应网页中查找
url = 'http://www.people.com.cn/'
spider(url, headers)
analyse()