python爬取网页版QQ空间,生成各类图表


Posted in Python onJune 02, 2021

github源码地址:

https://github.com/kuishou68/python

各类图表的实现效果

python爬取网页版QQ空间,生成各类图表

爬取的说说内容

python爬取网页版QQ空间,生成各类图表

个性化说说内容词云图

python爬取网页版QQ空间,生成各类图表

每年发表说说总数柱状图、每年点赞和评论折线图

python爬取网页版QQ空间,生成各类图表

7天好友动态柱状图、饼图

python爬取网页版QQ空间,生成各类图表

使用方法

按照你的谷歌浏览器下载指定版本的驱动 http://chromedriver.storage.googleapis.com/index.html

python爬取网页版QQ空间,生成各类图表

python爬取网页版QQ空间,生成各类图表

驱动跟两个python脚本放入同目录,我的版本是90.0.4430的,查看你自己的版本,下载后把我的chromedriver.exe替换掉!

python爬取网页版QQ空间,生成各类图表

这里用到了很多第三方包,鼠标放在报红的包名下,用Alt+Enter导包,如果失败则在控制台用下面的必杀技

pip install 包名 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

python爬取网页版QQ空间,生成各类图表

主要代码

qq空间txt.py

import time
from selenium import webdriver
from lxml import etree

# 这里一定要设置编码格式,防止后面写入文件时报错

friend = '1569339843'  # 朋友的QQ号,朋友的空间要求允许你能访问
user = '783533896'  # 你的QQ号
pw = '1323mkoNJI.@'  # 你的QQ密码

# 获取浏览器驱动
chrome_driver = 'chromedriver.exe'
driver = webdriver.Chrome(executable_path=chrome_driver)

# 浏览器窗口最大化
driver.maximize_window()

# 浏览器地址定向为qq登陆页面
driver.get("http://i.qq.com")

# 所以这里需要选中一下frame,否则找不到下面需要的网页元素
driver.switch_to.frame("login_frame")
time.sleep(3)
# 自动点击账号登陆方式
driver.find_element_by_id("switcher_plogin").click()
time.sleep(3)
# 账号输入框输入已知qq账号
driver.find_element_by_id("u").send_keys(user)
time.sleep(5)
# 密码框输入已知密码
driver.find_element_by_id("p").send_keys(pw)
time.sleep(5)
# 自动点击登陆按钮
driver.find_element_by_id("login_button").click()
time.sleep(5)
# 让webdriver操纵当前页
driver.switch_to.default_content()
time.sleep(5)
# 跳到说说的url, friend你可以任意改成你想访问的空间
driver.get("http://user.qzone.qq.com/" + friend + "/311")
time.sleep(5)
next_num = 0  # 初始“下一页”的id

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

    # 很多时候网页由多个<frame>或<iframe>组成,webdriver默认定位的是最外层的frame,
    # 所以这里需要选中一下说说所在的frame,否则找不到下面需要的网页元素
    driver.switch_to.frame("app_canvas_frame")
    selector = etree.HTML(driver.page_source)
    divs = selector.xpath('//*[@id="msgList"]/li/div[3]')

    # 这里使用 a 表示内容可以连续不清空写入
    with open('qq_word.txt', 'a', encoding="utf-8") as f:
        for div in divs:
            qq_name = div.xpath('./div[2]/a/text()')
            qq_content = div.xpath('./div[2]/pre/text()')
            qq_time = div.xpath('./div[4]/div[1]/span/a/text()')
            qq_praise = div.xpath('./div[4]/div[2]/span/span/a[2]/text()')
            qq_comment = div.xpath('./div[4]/div[2]/a[3]/text()')

            qq_name = qq_name[0] if len(qq_name) > 0 else ''
            qq_content = qq_content[0] if len(qq_content) > 0 else ''
            qq_content = qq_content.replace('\n', ' ')
            qq_time = qq_time[0] if len(qq_time) > 0 else ''
            qq_praise = qq_praise[0] if len(qq_praise) > 0 else ''
            qq_comment = qq_comment[0] if len(qq_comment) > 0 else ''
            print(qq_name, qq_time, qq_content, qq_praise, qq_comment)
            f.write(qq_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()

# 关闭浏览器
driver.quit()

各种图表的生成

import pandas as pd
from pyecharts.charts import Bar
from pyecharts.charts import Pie
import pyecharts.options as opts
from pyecharts.charts import Line

import re

df_excel = pd.read_excel('qq_excel.xlsx')  # 默认读取sheet=0 Pandas DataFrame'

def getTimeStr(row):
    item = row['时间']
    if pd.isnull(item) | pd.isna(item):
        return

    data = item.split('年')[0]
    return data

# 按年统计说说数量
def readCount(result, row):
    timeData = getTimeStr(row)
    if timeData == None: return
    if timeData in result.keys():
        result[timeData] += 1
    else:
        result[timeData] = 1

# 按年统计说说点赞数
def readThumb(result, row):
    item = row['赞']
    if pd.isnull(item):
        return
    # data = re.match(r'赞\((\d+).*', item, re.M | re.I)
    if len(item.split("(")) <= 1:
        return
    data = item.split("(")[1].split(")")[0]

    timeData = getTimeStr(row)
    if timeData == None: return
    if timeData in result.keys():
        result[timeData] += int(data)
    else:
        result[timeData] = int(data)

# 按年统计说说评论数
def readComment(result, row):
    item = row['评论']
    if pd.isnull(item):
        return
    # data = re.match(r'赞\((\d+).*', item, re.M | re.I)
    if len(item.split("(")) <= 1:
        return
    data = item.split("(")[1].split(")")[0]

    timeData = getTimeStr(row)
    if timeData == None: return
    if timeData in result.keys():
        result[timeData] += int(data)
    else:
        result[timeData] = int(data)


def readExcel(df_excel):
    count = {}
    result = {}
    thumb = {}
    comment = {}
    for index, row in df_excel.iterrows():
        readCount(count, row)
        readThumb(thumb, row)
        readComment(comment, row)

    result['count'] = count
    result['thumb'] = thumb
    result['comment'] = comment
    return result

def getKeyAndVal(keyWord):
    data = readExcel(df_excel).get(keyWord)
    key = []
    value = []
    for item in data.keys():
        key.append(item)
        value.append(data[item])
    key.reverse()
    value.reverse()
    return [key, value]

# 统计每年发表说说次数柱状图
def paintBar():
    count = readExcel(df_excel).get('count')
    # V1 版本开始支持链式调用
    data = getKeyAndVal('count')
    print(data[0])
    d = (
        Bar()
            .add_xaxis(data[0])
            .add_yaxis("每年发表说说总数", data[1])
            .render("每年发表说说总数柱状图.html")
    )
paintBar()

# 统计点赞和评论折线图
def paintLine():
    commentData = getKeyAndVal('comment')
    thumbData = getKeyAndVal('thumb')

    xaxis_data = commentData[0]
    commentValue = commentData[1]
    thumbValue = thumbData[1]
    d = (
        Line()
            .add_xaxis(xaxis_data=xaxis_data)
            .add_yaxis("每年评论数", y_axis=commentValue)
            .add_yaxis("每年点赞数", y_axis=thumbValue)
            .render("每年点赞和评论折现图.html")  # 输出图形
    )
paintLine()

其他代码自行下载项目查看

以上就是python爬取网页版QQ空间,生成各类图表的详细内容,更多关于python 爬取QQ空间的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python中zfill()方法的使用教程
May 20 Python
详解Python中的__new__、__init__、__call__三个特殊方法
Jun 02 Python
python中利用xml.dom模块解析xml的方法教程
May 24 Python
100行python代码实现跳一跳辅助程序
Jan 15 Python
python命令行解析之parse_known_args()函数和parse_args()使用区别介绍
Jan 24 Python
python中使用PIL制作并验证图片验证码
Mar 15 Python
pygame实现雷电游戏雏形开发
Nov 20 Python
如何通过python实现人脸识别验证
Jan 17 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
Feb 07 Python
Django DRF APIView源码运行流程详解
Aug 17 Python
Django自带用户认证系统使用方法解析
Nov 12 Python
python基于Kivy写一个图形桌面时钟程序
Jan 28 Python
Python爬虫实战之爬取携程评论
Pytorch DataLoader shuffle验证方式
python 爬取吉首大学网站成绩单
python 批量压缩图片的脚本
Jun 02 #Python
python操作xlsx格式文件并读取
关于Numpy之repeat、tile的用法总结
Jun 02 #Python
Matlab如何实现矩阵复制扩充
Jun 02 #Python
You might like
VML绘图板②脚本--VMLgraph.js、XMLtool.js
2006/10/09 PHP
php获取通过http协议post提交过来xml数据及解析xml
2012/12/16 PHP
深入apache配置文件httpd.conf的部分参数说明
2013/06/28 PHP
PHP中使用Imagick读取pdf并生成png缩略图实例
2015/01/21 PHP
PHP模板解析类实例
2015/07/09 PHP
Yii2框架中日志的使用方法分析
2017/05/22 PHP
Laravel框架在本地虚拟机快速安装的方法详解
2018/06/11 PHP
TNC vs RR BO3 第一场 2.14
2021/03/10 DOTA
鼠标移到导航当前位置的LI变色处于选中状态
2013/08/23 Javascript
javascript学习笔记之10个原生技巧
2014/05/21 Javascript
jQuery中:input选择器用法实例
2015/01/03 Javascript
jQuery实现左右切换焦点图
2015/04/03 Javascript
JavaScript实现的简单拖拽效果
2015/06/01 Javascript
简介可以自动完成UI的AngularJS工具angular-smarty
2015/06/23 Javascript
jQuery Validate插件实现表单验证
2016/08/19 Javascript
jQuery实现的多张图无缝滚动效果【测试可用】
2016/09/12 Javascript
AngularJS ng-template寄宿方式用法分析
2016/11/07 Javascript
js 中文汉字转Unicode、Unicode转中文汉字、ASCII转换Unicode、Unicode转换ASCII、中文转换
2016/12/06 Javascript
从零开始学习Node.js系列教程之SQLite3和MongoDB用法分析
2017/04/13 Javascript
JavaScript中为事件指定处理程序的五种方式分析
2018/07/27 Javascript
ES6学习笔记之let与const用法实例分析
2020/01/22 Javascript
javascript实现的图片预览和上传功能示例【兼容IE 9】
2020/05/01 Javascript
使用Python编写简单的画图板程序的示例教程
2015/12/08 Python
Python 中的 else详解
2016/04/23 Python
详解Python 序列化Serialize 和 反序列化Deserialize
2017/08/20 Python
zookeeper python接口实例详解
2018/01/18 Python
python使用pdfminer解析pdf文件的方法示例
2018/12/20 Python
python的help函数如何使用
2020/06/11 Python
Python3爬虫带上cookie的实例代码
2020/07/28 Python
会计专业毕业生推荐信
2013/11/05 职场文书
校园歌手大赛策划书
2014/01/17 职场文书
致跳远运动员广播稿
2014/02/11 职场文书
健康教育评估方案
2014/05/25 职场文书
支行行长竞聘报告
2014/11/06 职场文书
2015年财政所工作总结
2015/04/25 职场文书
优秀共产党员事迹材料2016
2016/02/29 职场文书