python爬虫学习:爬虫QQ说说并生成词云图,回忆满满

简介: 自学过一段时间的python,用django自己做了个网站,也用requests+BeautifulSoup爬虫过些简单的网站,周末研究学习了一波,准备爬取QQ空间的说说,并把内容存在txt中,读取生成云图。

自学过一段时间的python,用django自己做了个网站,也用requests+BeautifulSoup爬虫过些简单的网站,周末研究学习了一波,准备爬取QQ空间的说说,并把内容存在txt中,读取生成云图。
好久不登qq了,空间说说更是几年不玩了,里面满满的都是上学时候的回忆,看着看着就笑了,笑着笑着就...哈哈哈~~
无图言虚空

image

当年的我还是那么风华正茂、幽默风趣...
言归正传,本次使用的是 selenium模拟登录+ BeautifulSoup4爬取数据+ wordcloud生成词云图

BeautifulSoup安装

pip install beautifulsoup4
这里有beautifulsoup4 的 官方文档
还需要用到解析器,我选择的是html5lib解析器pip install html5lib
下表列出了主要的解析器,以及它们的优缺点:

解析器 使用方法 优势 劣势
Python标准库 BeautifulSoup(markup, "html.parser") Python的内置标准库 执行速度适中 文档容错能力强 Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差
lxml HTML 解析器 BeautifulSoup(markup, "lxml") 速度快 文档容错能力强 需要安装C语言库
lxml XML 解析器 BeautifulSoup(markup, ["lxml", "xml"]) BeautifulSoup(markup, "xml") 速度快 唯一支持XML的解析器 需要安装C语言库
html5lib BeautifulSoup(markup, "html5lib") 最好的容错性 以浏览器的方式解析文档 生成HTML5格式的文档 速度慢 不依赖外部扩展

selenium模拟登录

使用selenium模拟登录QQ空间,安装pip install selenium
我用的是chrom浏览器,webdriver.Chrome(),获取Chrome浏览器的驱动。
这里还需要下载安装对应浏览器的驱动,否则在运行脚本时,会提示
chromedriver executable needs to be in PATH错误,用的是mac,网上找的一篇下载驱动的文章,https://blog.csdn.net/zxy987872674/article/details/53082896
同理window的也一样,下载对应的驱动,解压后,将下载的**.exe 放到Python的安装目录,例如 D:\python 。 同时需要将Python的安装目录添加到系统环境变量里。

qq登录页http://i.qq.com,利用webdriver打开qq空间的登录页面

driver = webdriver.Chrome()
driver.get("http://i.qq.com")

image

打开之后右击检查查看页面元素,发现帐号密码登录在 login_frame里,先定位到所在的frame, driver.switch_to.frame("login_frame") ,再自动点击 帐号密码登录 按钮,自动输入帐号密码登录,并且打开说说页面,详细代码如下

friend = '' # 朋友的QQ号,**朋友的空间要求允许你能访问**,这里可以输入自己的qq号
user = ''  # 你的QQ号
pw = ''  # 你的QQ密码

 # 获取浏览器驱动
driver = webdriver.Chrome()
 # 浏览器窗口最大化
driver.maximize_window()
 # 浏览器地址定向为qq登陆页面
driver.get("http://i.qq.com")

 # 定位到登录所在的frame
driver.switch_to.frame("login_frame")

 # 自动点击账号登陆方式
driver.find_element_by_id("switcher_plogin").click()
 # 账号输入框输入已知qq账号
driver.find_element_by_id("u").send_keys(user)
 # 密码框输入已知密码
driver.find_element_by_id("p").send_keys(pw)
 # 自动点击登陆按钮
driver.find_element_by_id("login_button").click()
 # 让webdriver操纵当前页
driver.switch_to.default_content()
 # 跳到说说的url, friend可以任意改成你想访问的空间,比如这边访问自己的qq空间
driver.get("http://user.qzone.qq.com/" + friend + "/311")

这个时候可以看到已经打开了qq说说的页面了,注意 部分空间打开之后会出现一个提示框,需要先模拟点击事件关闭这个提示框

image

tm我以前竟然还有个黄钻,好可怕~~,空间头像也是那么的年轻、主流...

try:
    #找到关闭按钮,关闭提示框
    button = driver.find_element_by_id("dialog_button_111").click()
except:
    pass

同时因为说说内容是动态加载的,需要自动下拉滚动条,加载出全部的内容,再模拟点击 下一页 加载内容。具体代码见下面。

BeautifulSoup爬取说说

F12查看内容,可以找到说说在feed_wrap这个<div><ol>里面的<li>标签数组里面,具体每条说说内容在<div> class="bd"<pre>标签中。

image


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文件里
接下来生成词云图

词云图

使用wordcloud包生成词云图,pip install wordcloud
这里还可以使用jieba分词,我并没有使用,因为我觉得qq说说的句子读起来才有点感觉,个人喜好,用jieba分词可以看到说说高频次的一些词语。
设置下wordcloud的一些属性,注意 这里要设置font_path属性,否则汉字会出现乱码。
这里还有个要提醒的是,如果使用了虚拟环境的,不要在虚拟环境下运行以下脚本,否则可能会报错 RuntimeError: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly if Python is not installed as a framework. See the Python documentation for more information on installing Python as a framework on Mac OS X. Please either reinstall Python as a framework, or try one of the other backends. If you are using (Ana)Conda please install python.app and replace the use of 'python' with 'pythonw'. See 'Working with Matplotlib on OSX' in the Matplotlib FAQ for more information. ,我就遇到了这种情况,deactivate 退出了虚拟环境再跑的

# coding:utf-8

from wordcloud import WordCloud
import matplotlib.pyplot as plt

# 生成词云
def create_word_cloud(filename):
    # 读取文件内容
    text = open("{}.txt".format(filename), encoding='utf-8').read()
    # 设置词云
    wc = WordCloud(
        # 设置背景颜色
        background_color="white",
        # 设置最大显示的词云数
        max_words=2000,
        # 这种字体都在电脑字体中,window在C:\Windows\Fonts\下,mac我选的是/System/Library/Fonts/PingFang.ttc 字体
        font_path='/System/Library/Fonts/PingFang.ttc',
        height=1200,
        width=2000,
        # 设置字体最大值
        max_font_size=100,
        # 设置有多少种随机生成状态,即有多少种配色方案
        random_state=30,
    )

    myword = wc.generate(text)  # 生成词云
    # 展示词云图
    plt.imshow(myword)
    plt.axis("off")
    plt.show()
    wc.to_file('qq_word.png')  # 把词云保存下


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

至此,爬取qq说说内容,并生成词云图。
源码github地址: https://github.com/taixiang/spiderQQ

欢迎关注我的博客:http://blog.manjiexiang.cn/
欢迎关注微信号:春风十里不如认识你

image.png

目录
相关文章
|
9月前
|
数据采集 Web App开发 数据安全/隐私保护
实战:Python爬虫如何模拟登录与维持会话状态
实战:Python爬虫如何模拟登录与维持会话状态
|
9月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
496 2
|
9月前
|
存储 Java 数据处理
(numpy)Python做数据处理必备框架!(一):认识numpy;从概念层面开始学习ndarray数组:形状、数组转置、数值范围、矩阵...
Numpy是什么? numpy是Python中科学计算的基础包。 它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/0 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。 Numpy能做什么? numpy的部分功能如下: ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++
714 1
|
9月前
|
算法 Java Docker
(Python基础)新时代语言!一起学习Python吧!(三):IF条件判断和match匹配;Python中的循环:for...in、while循环;循环操作关键字;Python函数使用方法
IF 条件判断 使用if语句,对条件进行判断 true则执行代码块缩进语句 false则不执行代码块缩进语句,如果有else 或 elif 则进入相应的规则中执行
1591 1
|
10月前
|
数据采集 Web App开发 自然语言处理
新闻热点一目了然:Python爬虫数据可视化
新闻热点一目了然:Python爬虫数据可视化
|
9月前
|
数据采集 监控 数据库
Python异步编程实战:爬虫案例
🌟 蒋星熠Jaxonic,代码为舟的星际旅人。从回调地狱到async/await协程天堂,亲历Python异步编程演进。分享高性能爬虫、数据库异步操作、限流监控等实战经验,助你驾驭并发,在二进制星河中谱写极客诗篇。
Python异步编程实战:爬虫案例
|
10月前
|
数据采集 存储 XML
Python爬虫技术:从基础到实战的完整教程
最后强调: 父母法律法规限制下进行网络抓取活动; 不得侵犯他人版权隐私利益; 同时也要注意个人安全防止泄露敏感信息.
1100 19
|
9月前
|
存储 Java 索引
(Python基础)新时代语言!一起学习Python吧!(二):字符编码由来;Python字符串、字符串格式化;list集合和tuple元组区别
字符编码 我们要清楚,计算机最开始的表达都是由二进制而来 我们要想通过二进制来表示我们熟知的字符看看以下的变化 例如: 1 的二进制编码为 0000 0001 我们通过A这个字符,让其在计算机内部存储(现如今,A 字符在地址通常表示为65) 现在拿A举例: 在计算机内部 A字符,它本身表示为 65这个数,在计算机底层会转为二进制码 也意味着A字符在底层表示为 1000001 通过这样的字符表示进行转换,逐步发展为拥有127个字符的编码存储到计算机中,这个编码表也被称为ASCII编码。 但随时代变迁,ASCII编码逐渐暴露短板,全球有上百种语言,光是ASCII编码并不能够满足需求
370 4
|
9月前
|
数据采集 存储 JSON
Python爬虫常见陷阱:Ajax动态生成内容的URL去重与数据拼接
Python爬虫常见陷阱:Ajax动态生成内容的URL去重与数据拼接

推荐镜像

更多