侧边栏壁纸
  • 累计撰写 30 篇文章
  • 累计创建 40 个标签
  • 累计收到 3 条评论

python爬取QQ空间说说,生成词云图

kiko
2021-07-08 / 0 评论 / 0 点赞 / 251 阅读 / 4,107 字
温馨提示:
本文最后更新于 2022-02-26,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

随着微信逐渐的崛起,渐渐打败了昔日的霸主QQ,日常分享动态的平台也逐渐从QQ空间转移到了朋友圈,现在回去看QQ空间,每天更新的动态不到十个,突然萌生一个想法,将我以前发的那些蠢话全部爬取下来,做成一张回忆录。。。废话不多说,开始本教程。

词云图

本教程主要参考知乎大佬:程序猿tx
python爬虫QQ说说并生成词云图,回忆满满

建议先看看大佬的怎么做的。再看看我的教程。

本教程所需的知识点:python基础、 label seleniumcolor blue模拟登录、 label BeautifulSoup blue 爬取数据、 label wordcloud blue 生成词云图

1.安装所需要的包

使用cmd或者终端,使用pip包管理器进行安装,有时候会报错,大概是pip版本太低,看报错信息进行升级即可。

pip install selenium
pip install beautifulsoup4
pip install html5lib
pip install wordcloud

beautifulsoup4官方文档
selenium + python 中文文档
wordcloud官方文档

2.登录QQ空间

这里使用 label seleniumcolor blue 进行模拟登录,会调用一个浏览器,进行自动化操作。
自动登录
贴上代码:

from selenium import webdriver
from bs4 import BeautifulSoup
import time

###############################
friend = 'xxxxxxxx'  # 朋友的QQ号,这里可以爬取朋友的说说。**前提是朋友的空间要求允许你能访问**,不想就输入你自己的
#user = 'xxxxxxxx'  # 你的QQ号
#pw = 'xxxxxxxx'  # 你的QQ密码
###############################

# 实例化一个浏览器对象
driver = webdriver.Chrome()
driver.get('https://qzone.qq.com/')

# # 标签定位
driver.switch_to.frame('login_frame')  # 切换浏览器标签定位的作用域

# 自动登录
div = driver.find_element_by_class_name('face')
div.click()  # 点击
time.sleep(1)

# 让webdriver操纵当前页
driver.switch_to.default_content()

# 跳到说说的url, friend可以任意改成你想访问的空间,比如这边访问自己的qq空间
driver.get("http://user.qzone.qq.com/" + friend + "/311")

这里对上面的代码解释一下:

实例化一个浏览器对象,这里使用了Chrome浏览器,也可以换成Edge或其他。
使用前必须安装对应浏览器的驱动,否则会报错 label chromedriver executable needs to be in PATH red ,这里给上一个Chrome的教程:安装驱动

Edge也差不多Edge驱动下载,不过需要自己将名字改成 label MicrosoftWebDriver.exe blue

在知乎大佬的那篇文章里,使用的是账号密码登录,但我这里使用了自动登录。因为现在安全升级,账号密码登录还需要验证手机号和拖动验证码,难度大幅增加。所以这里使用自动登录,事先将QQ登录好。

3.爬取空间说说

这里和知乎大佬的一样

控制台打开查看说说所在的html标签。

next_num = 0  # 初始“下一页”的id
while True:
    # 下拉滚动条,使浏览器加载出全部的内容,
    # 这里是从0开始到5结束 分5 次加载完每页数据
    for i in range(0, 5):
        height = 20000 * i  # 每次滑动20000像素
        strWord = "window.scrollBy(0," + str(height) + ")"
        driver.execute_script(strWord)
        time.sleep(2)

    # 这里需要选中 说说 所在的frame,否则找不到下面需要的网页元素
    driver.switch_to.frame("app_canvas_frame")
    # 解析页面元素
    content = BeautifulSoup(driver.page_source, "html5lib")
    # 找到"feed_wrap"的div里面的ol标签
    ol = content.find("div", class_="feed_wrap").ol
    # 通过find_all遍历li标签数组
    lis = ol.find_all("li", class_="feed")

    # 将说说内容写入文件,使用 a 表示内容可以连续不清空写入
    with open('qq_word.txt', 'a', encoding='utf-8') as f:
        for li in lis:
            bd = li.find("div", class_="bd")
            #找到具体说说所在标签pre,获取内容
            ss_content = bd.pre.get_text()
            f.write(ss_content + "\n")

    # 当已经到了尾页,“下一页”这个按钮就没有id了,可以结束了
    if driver.page_source.find('pager_next_' + str(next_num)) == -1:
        break
    # 找到“下一页”的按钮,因为下一页的按钮是动态变化的,这里需要动态记录一下
    driver.find_element_by_id('pager_next_' + str(next_num)).click()
    # “下一页”的id
    next_num += 1
    # 因为在下一个循环里首先还要把页面下拉,所以要跳到外层的frame上
    driver.switch_to.parent_frame()

如果你的说说很多,爬取需要等待一段时间,待翻到最后一页

至此QQ说说已经爬取下来,并且保存在了qq_word.txt文件里

接下来进行一些精简操作

4.简化说说

相比有些经常发说说的人,最终爬取下来的qq_word里有十多万的字数,这么多的说说定是放不下一张词云的,所以为了词云图的美观,这里筛选了字数较少的说说。

import random

f = open(file='qq_word.txt', mode='r', encoding="utf-8")
# print(f.readline())  # 读⼀⾏
r = open('qq_word_simplify.txt', 'w', encoding='utf-8')
for line in f:
    if line != "\n":
		# 将字数少于25的说说保存下来
        if len(line) <= 25:
            print(line, end="")
            line = line.strip('\n')
            r.write(line + "\n")

r.close()
f.close()

精简后的说说放在了qq_word_simplify.txt这个文件中。

5.生成词云图

wordcloud教程

# coding:utf-8
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import time


# 生成词云
def create_word_cloud(filename):

    # 读取文件内容
    text = open("{}.txt".format(filename), encoding='utf-8').read()
    # 设置词云
    stopwords = set('')
	# 此处设置过滤掉的文字
    stopwords.update(
        ['叫'])
    wc = WordCloud(
        # 设置背景颜色
        background_color="white",
        # 设置最大显示的词云数
        max_words=10000,
        # 字体,楷体。可以自己更换
        font_path='C:\Windows\Fonts\STKAITI.TTF',
        # 图片宽高边距
        height=1440,
        width=2560,
		# 文字之间的间距
        margin=1, 
        # 设置字体最大值、最小值
        max_font_size=400,
        min_font_size=10,
        # 设置有多少种随机生成状态,即有多少种配色方案
        # random_state=2,
		# 文字的颜色库
        colormap='Set3',
        # 过滤字
        stopwords=stopwords,
    )
    print("生成中...")
    myword = wc.generate(text)  # 生成词云
    # 展示词云图
    plt.imshow(myword)
    plt.axis("off")
    plt.show()
    t = time.strftime("%H_%M_%S", time.localtime())
    wc.to_file('qq_word_' + t + '.png')  # 把词云保存下
    print("保存成功!!")


if __name__ == '__main__':
    create_word_cloud('qq_word_simplify')

这里主要是调整参数比较烦人,colormap是WordCloud的颜色库,参考Python中Wordcloud模块colormap的参数及其对应的色条

字体可以自己设置,用电脑上安装的,在C:\Windows\Fonts\下,记得右键属性查看真实的名字
华文隶书

保存的图片名称为qq_word_时间.png

有的小伙伴可能会说图片的小字太模糊,这里有另一种生成方式,将宽高删除,改用scale=64,数字越高越清晰,但是内容会减少。

至此,教程结束。有不懂的可以评论留言

0

评论区