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使用心得之获得github代码库列表
Jun 25 Python
python time模块用法实例详解
Sep 11 Python
Python编程中实现迭代器的一些技巧小结
Jun 21 Python
查看django版本的方法分享
May 14 Python
Python实现的序列化和反序列化二叉树算法示例
Mar 02 Python
python如何以表格形式打印输出的方法示例
Jun 21 Python
python3.6中@property装饰器的使用方法示例
Aug 17 Python
解决pycharm启动后总是不停的updating indices...indexing的问题
Nov 27 Python
使用pyhon绘图比较两个手机屏幕大小(实例代码)
Jan 03 Python
tensorflow保持每次训练结果一致的简单实现
Feb 17 Python
python调用百度API实现人脸识别
Nov 17 Python
你喜欢篮球吗?Python实现篮球游戏
Jun 11 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
PHP高自定义性安全验证码代码
2011/11/27 PHP
使用Linux五年积累的一些经验技巧
2013/06/20 PHP
简单的php+mysql聊天室实现方法(附源码)
2016/01/05 PHP
PHP MSSQL 分页实例
2016/04/13 PHP
PHP Filter过滤器全面解析
2016/08/09 PHP
php面向对象之反射功能与用法分析
2017/03/29 PHP
yii框架无限极分类的实现方法
2017/04/08 PHP
Javascript - HTML的request类
2007/01/09 Javascript
jquery中的$(document).ready()使用小结
2014/02/14 Javascript
JavaScript 开发工具webstrom使用指南
2014/12/09 Javascript
用Node.js通过sitemap.xml批量抓取美女图片
2015/05/28 Javascript
不得不分享的JavaScript常用方法函数集(上)
2015/12/23 Javascript
js获取及修改网页背景色和字体色的方法
2015/12/29 Javascript
利用jquery实现下拉框的禁用与启用
2016/12/07 Javascript
node+koa实现数据mock接口的方法
2017/09/20 Javascript
基于vue-cli vue-router搭建底部导航栏移动前端项目
2018/02/28 Javascript
原生JavaScript实现todolist功能
2018/03/02 Javascript
js函数和this用法实例分析
2020/03/13 Javascript
js实现购物车商品数量加减
2020/09/21 Javascript
夯基础之手撕javascript继承详解
2020/11/09 Javascript
vue中实现点击空白区域关闭弹窗的两种方法
2020/12/30 Vue.js
vue常用高阶函数及综合实例
2021/02/25 Vue.js
[07:48]DOTA2上海特级锦标赛主赛事首日RECAP
2016/03/04 DOTA
python字典键值对的添加和遍历方法
2016/09/11 Python
Python处理CSV与List的转换方法
2018/04/19 Python
详解python数据结构和算法
2019/04/18 Python
python使用socket 先读取长度,在读取报文内容示例
2019/09/26 Python
Python使用turtle库绘制小猪佩奇(实例代码)
2020/01/16 Python
Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式
2020/05/11 Python
CAT鞋英国官网:坚固耐用的靴子和鞋
2016/10/21 全球购物
优秀毕业生推荐信
2013/11/02 职场文书
企业家王石演讲稿:坚持与放下
2014/04/27 职场文书
Python中常见的反爬机制及其破解方法总结
2021/06/10 Python
python 安全地删除列表元素的方法
2022/03/16 Python
python中的random模块和相关函数详解
2022/04/22 Python
Python 文字识别
2022/05/11 Python