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内置函数的用法实例教程
Sep 08 Python
Django中URLconf和include()的协同工作方法
Jul 20 Python
python matlibplot绘制多条曲线图
Feb 19 Python
python版opencv摄像头人脸实时检测方法
Aug 03 Python
Python面向对象之继承和组合用法实例分析
Aug 27 Python
python单例模式实例解析
Aug 28 Python
Python实现Event回调机制的方法
Feb 13 Python
代码实例讲解python3的编码问题
Jul 08 Python
在notepad++中实现直接运行python代码
Dec 18 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
Apr 01 Python
pytorch 把图片数据转化成tensor的操作
Mar 04 Python
Python pandas之求和运算和非空值个数统计
Aug 07 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
phpMyAdmin2.11.6安装配置方法
2008/08/24 PHP
PHP反向代理类代码
2014/08/15 PHP
使用XHProf查找PHP性能瓶颈的实例
2017/12/13 PHP
js中将URL中的参数提取出来作为对象的实现代码
2011/08/16 Javascript
ASP.NET jQuery 实例3 (在TextBox里面阻止复制、剪切和粘贴事件)
2012/01/13 Javascript
改进版通过Json对象实现深复制的方法
2012/10/24 Javascript
js交换排序 冒泡排序算法(Javascript版)
2014/10/04 Javascript
jQuery消息提示框插件Tipso
2015/05/04 Javascript
详解Node.js包的工程目录与NPM包管理器的使用
2016/02/16 Javascript
AnjularJS中$scope和$rootScope的区别小结
2016/09/18 Javascript
Vue.JS入门教程之处理表单
2016/12/01 Javascript
jQuery插件HighCharts绘制2D半圆环图效果示例【附demo源码下载】
2017/03/09 Javascript
利用js实现前后台传送Json的示例代码
2018/03/29 Javascript
Vue.js 通过jQuery ajax获取数据实现更新后重新渲染页面的方法
2018/08/09 jQuery
详解vue使用vue-layer-mobile组件实现toast,loading效果
2018/08/31 Javascript
利用百度echarts实现图表功能简单入门示例【附源码下载】
2019/06/10 Javascript
在vue中动态添加class类进行显示隐藏实例
2019/11/09 Javascript
Python实现遍历数据库并获取key的值
2015/05/17 Python
Python实用技巧之利用元组代替字典并为元组元素命名
2018/07/11 Python
Form表单及django的form表单的补充
2019/07/25 Python
Python实现PyPDF2处理PDF文件的方法示例
2019/09/25 Python
Python编写一个验证码图片数据标注GUI程序附源码
2019/12/09 Python
Python pandas库中的isnull()详解
2019/12/26 Python
Python实现bilibili时间长度查询的示例代码
2020/01/14 Python
Django自定义全局403、404、500错误页面的示例代码
2020/03/08 Python
python编写实现抽奖器
2020/09/10 Python
英国安全产品购物网站:The Safe Shop
2017/03/20 全球购物
马来西亚银饰品牌:JEOEL
2017/12/15 全球购物
美国领先的商务贺卡出版商:The Gallery Collection
2018/02/13 全球购物
事务机电主管工作职责
2014/02/25 职场文书
数控专业毕业生求职信
2014/06/12 职场文书
2014年教师节讲话稿5篇
2014/09/10 职场文书
狮子林导游词
2015/02/03 职场文书
2015年街道除四害工作总结
2015/05/15 职场文书
教师读书活动心得体会
2016/01/14 职场文书
Python采集股票数据并制作可视化柱状图
2022/04/04 Python