爬虫——爬取人民网数据生成词云图

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()


猜你喜欢

转载自blog.csdn.net/noingw96/article/details/83960976