随着微信逐渐的崛起,渐渐打败了昔日的霸主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.生成词云图
# 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,数字越高越清晰,但是内容会减少。
至此,教程结束。有不懂的可以评论留言
评论区