美文网首页
Python爬虫实战(6)-爬取QQ空间好友说说并生成词云(超详

Python爬虫实战(6)-爬取QQ空间好友说说并生成词云(超详

作者: 秦子帅 | 来源:发表于2019-01-08 22:32 被阅读87次

    title: Python爬虫实战(6)-爬取QQ空间好友说说并生成词云(超详细)
    categories: Python爬虫实战
    tags:

    • 爬虫实战


    前言

    先看效果图:


    TXT文件:


    如果想生成特定图片样式的词云图,可以直接访问下面这篇文章学一下:
    https://mp.weixin.qq.com/s/FUwQ4jZu6KMkjRvEG3UfGw
    前几天我们陆陆续续的讲了Python如何生成词云以及Selenium的安装使用,今天我们综合一下这些知识,写一篇爬虫实战文章,带大家爬取QQ空间好友说说写人本地txt文件,并生成词云。
    大家一定很感兴趣吧?下面开始正题。

    思路

    1.确认访问的URL
    2.模拟登录你的QQ号
    3.判断好友空间是否加了权限,切换到说说的frame,爬取当前页面数据,下拉滚动条,翻页继续获取 爬取的内容写入本地TXT文件中
    4.爬取到最后一页,读取TXT文件从而生成词云

    具体分析

    1.确认访问的URL
    这就很简单了,我们通过观察发现,QQ空间好友的URL:
    https://user.qzone.qq.com/{好友QQ号}/311

    2.我们在请求的时候会遇到模拟登录,也就是要通过Selenium+浏览器登录你的QQ号后才能访问你好友的QQ空间
    下面是模拟登录的代码:

    file = 'C:/Users/Administrator/Desktop/{}.txt'.format(qq)
        driver = webdriver.Firefox()
        driver.maximize_window() #窗口最大化
    
        driver.get('https://user.qzone.qq.com/{}/311'.format(qq))  #URL
        driver.implicitly_wait(10)  # 隐示等待,为了等待充分加载好网址
        driver.find_element_by_id('login_div')
        driver.switch_to_frame('login_frame') #切到输入账号密码的frame
        driver.find_element_by_id('switcher_plogin').click()##点击‘账号密码登录’
        driver.find_element_by_id('u').clear() ##清空账号栏
        driver.find_element_by_id('u').send_keys('你的QQ账号')#输入账号
        driver.find_element_by_id('p').clear()#清空密码栏
        driver.find_element_by_id('p').send_keys('你的QQ密码')#输入密码
        driver.find_element_by_id('login_button').click()#点击‘登录’
        driver.switch_to_default_content()   #跳出当前的frame,这步很关键,不写会报错的,因为你登录后还要切刀另一个frame
    

    需要强调是 **driver.switch_to_default_content() **,表示跳出当前的frame,这步很关键,因为你登录后还要切刀另一个frame。不写的话会出现下面的错误:


    3.第三部分我分几个点来说:
    (1).判断空间是否加了权限

        try:
            driver.find_element_by_id('QM_OwnerInfo_Icon')#判断是否QQ空间加了权限
            b = True
        except:
            b = False
    

    (2)切换到说说的frame,这个大家都会找吧


    (3)下拉滚动条
    下拉滚动条是为了点击‘下一页’,下拉到可见视图。下拉滚动条要注意一点:
    一定要对应它的frame,不要在爬取说说的frame下拉。

    #分4此下拉,确保能下拉到底部
       for j in range(1, 5):
                        driver.execute_script("window.scrollBy(0,5000)")
                        time.sleep(2)
    

    (4).爬取说说数据,这就简单了吧?我用的xpath获取的说说的title,感兴趣的朋友可以把时间等数据一起获取

                    selector = etree.HTML(driver.page_source)
                    title = selector.xpath('//li/div/div/pre/text()')
    

    (5).翻页
    直接点击‘下一页’即可。

     driver.find_element_by_link_text(u'下一页').click()
    

    (6).txt数据写入,不用多说,爬取到title了直接写入

                    for i in title:
                        if not os.path.exists(file):
                            print('创建TXT成功')
    
                        with open(file, 'a+') as f:
                            f.write(i + '\n\n')
                            f.close()
    
    

    4.生成词云,这只是普通的模式,想具体了解可以看我以前文章或者Google

    def get_wordcloud(file):
    
    
        f = open(file, 'r', encoding='gbk').read()
    
        # 结巴分词,生成字符串,wordcloud无法直接生成正确的中文词云
        cut_text = " ".join(jieba.cut(f))
    
        wordcloud = WordCloud(
            # 设置字体,不然会出现口字乱码,文字的路径是电脑的字体一般路径,可以换成别的
            font_path="C:/Windows/Fonts/simfang.ttf",
            # 设置了背景,宽高
            background_color="white", width=2000, height=1380).generate(cut_text)
    
        plt.imshow(wordcloud, interpolation="bilinear")
        plt.axis("off")
        plt.show()
    
    

    由于时间问题,此篇文章只支持输入一个好友的QQ号,你要是想爬取你的所有的QQ好友的说说,可以现在QQ邮箱获取你所有好友的QQ号,然后生成一个数组,依次获取就可以了。

    源码

    # coding=utf-8
    from selenium import webdriver
    import  os
    from  lxml import  etree
    import time
    from wordcloud import WordCloud
    import matplotlib.pyplot as plt  # 绘制图像的模块
    import jieba  # jieba分词
    
    def get_wordcloud(file):
    
    
        f = open(file, 'r', encoding='gbk').read()
    
        # 结巴分词,生成字符串,wordcloud无法直接生成正确的中文词云
        cut_text = " ".join(jieba.cut(f))
    
        wordcloud = WordCloud(
            # 设置字体,不然会出现口字乱码,文字的路径是电脑的字体一般路径,可以换成别的
            font_path="C:/Windows/Fonts/simfang.ttf",
            # 设置了背景,宽高
            background_color="white", width=2000, height=1380).generate(cut_text)
    
        plt.imshow(wordcloud, interpolation="bilinear")
        plt.axis("off")
        plt.show()
    
    
    
    def get_qzone(qq):
    
        file = 'C:/Users/qzs/Desktop/{}.txt'.format(qq)
        driver = webdriver.Firefox()
        driver.maximize_window() #窗口最大化
    
        driver.get('https://user.qzone.qq.com/{}/311'.format(qq))  #URL
        driver.implicitly_wait(10)  # 隐示等待,为了等待充分加载好网址
        driver.find_element_by_id('login_div')
        driver.switch_to_frame('login_frame') #切到输入账号密码的frame
        driver.find_element_by_id('switcher_plogin').click()##点击‘账号密码登录’
        driver.find_element_by_id('u').clear() ##清空账号栏
        driver.find_element_by_id('u').send_keys('你的QQ账号')#输入账号
        driver.find_element_by_id('p').clear()#清空密码栏
        driver.find_element_by_id('p').send_keys('你的QQ密码')#输入密码
        driver.find_element_by_id('login_button').click()#点击‘登录’
        driver.switch_to_default_content()   #跳出当前的frame,这步很关键,不写会报错的,因为你登录后还要切刀另一个frame
    
    
        driver.implicitly_wait(10)
        time.sleep(3)
    
        try:
            driver.find_element_by_id('QM_OwnerInfo_Icon')#判断是否QQ空间加了权限
            b = True
        except:
            b = False
    
        if b==True:
            page = 1;
    
            try:
                while page:
                    ##下拉
                    for j in range(1, 5):
                        driver.execute_script("window.scrollBy(0,5000)")
                        time.sleep(2)
    
                    driver.switch_to_frame('app_canvas_frame')#切入说说frame
                    selector = etree.HTML(driver.page_source)
                    title = selector.xpath('//li/div/div/pre/text()') ##获取title集合
                    print(title)
                    
                    for i in title:
                        if not os.path.exists(file):
                            print('创建TXT成功')
    
                        with open(file, 'a+') as f:
                            f.write(i + '\n\n')
                            f.close()
                            
                    page = page + 1
                    driver.find_element_by_link_text(u'下一页').click()  #点击下一页
                    driver.switch_to.default_content()    #跳出当前frame
                    time.sleep(3)
                driver.quit()
            except Exception as e:
                #我没有判断什么时候为最后一页,当爬取到最后一页,
                # 默认点击下一页,会出现异常,我直接在这认为它是爬到末尾了,还是有待优化
                print("爬取完成,爬到的最后页数为" + str(page - 1))
                get_wordcloud(file)
                driver.quit()
                driver.close()
    
    
    
    
    if __name__ == '__main__':
    
        get_qzone('要爬取的QQ空间好友的QQ号')
    

    相关文章

      网友评论

          本文标题:Python爬虫实战(6)-爬取QQ空间好友说说并生成词云(超详

          本文链接:https://www.haomeiwen.com/subject/scrfcqtx.html