python爬取网页版QQ空间,生成各类图表
作者:kuishou68 发布时间:2023-01-18 06:30:58
标签:python,爬虫,qq空间,生成图表
github源码地址:
https://github.com/kuishou68/python
各类图表的实现效果
爬取的说说内容
个性化说说内容词云图
每年发表说说总数柱状图、每年点赞和评论折线图
7天好友动态柱状图、饼图
使用方法
按照你的谷歌浏览器下载指定版本的驱动 http://chromedriver.storage.googleapis.com/index.html
驱动跟两个python脚本放入同目录,我的版本是90.0.4430的,查看你自己的版本,下载后把我的chromedriver.exe替换掉!
这里用到了很多第三方包,鼠标放在报红的包名下,用Alt+Enter导包,如果失败则在控制台用下面的必杀技
pip install 包名 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
主要代码
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()
其他代码自行下载项目查看
来源:https://github.com/kuishou68/python
0
投稿
猜你喜欢
- 大部分情况下,这种动态生成的sql查询语句写法如下: 代码如下:select A表.字段1,A表.字段2,B表.字段返回,C表.字段返回 f
- 前段时日微软(Microsoft)正式发布了.NET Core 2.0,在很多开发社区中反响不错。但还是有一些开发者发出了疑问,.NET C
- 本文实例讲述了Django实现图片文字同时提交的方法。分享给大家供大家参考。具体分析如下:jQuery为我们网站开发解决了很多问题,使我们的
- 在官网下载源码包:https://www.php.net/downloads.php步骤:1、解压命令:tar -xjvf php.tar.
- 项目地址:https://github.com/chen0495/pythonCrawlerForJSU环境python 3.5即以上req
- 由于DOM(文档对象模型)概念的推出,这个API使HTML如虎添翼,但是有些学DHTML的朋友还是有些困挠,只是因为目前的手册的书写不太科学
- 后台实时监控服务器的CUP与内存占用率的场景很常见,虽然没做过,但是着手写代码之前我真没想到会花2个多小时才最终实现。网上虽然搜 PHP C
- SQL Server 2000 清理日志精品教程SQL Server 2000 数据库日志太大!如何清理SQL Server 2000的日志
- 目录时间戳相减装饰器timeit模块重复调用 timeit()cProfile性能分析工具时间戳相减在代码执行前后各记录一个时间点,两个时间
- 在我发表上一篇《Zen Coding: 一种快速编写HTML/CSS代码的方法》之后,有网友表示不知道怎么在Dreamweaver上使用ze
- 环境:A机器和B机器都是LINUX系统,但由于B机器已经空间不足,所以停掉不停操作数据库的服务后 ,准备在A机器进行导出操作。导出语句 ex
- 本程序有两文件test.asp 和tree.asp 还有一些图标文件 1。test.asp 调用类生成树 代码如下<%@
- 代码如下:'个人代码风格注释(变量名中第一个小写字母表表示变量类型) 'i:为Integer型; 's:为Strin
- 因此,在我接触那么多种语言当中,asp是最不严格的一种,是对程序员要求最低的一种。 昨天测试了asp.net、php和asp的运行速度比较,
- 本文介绍了在js和asp中使用FileSystemObject(fso)来: 创建、添加或删除数据,以及读取文件; 移动、复制和删除文件;创
- 插件很多从事互联网行业或者开发的人员来不是很陌生,wordpress之所以为什么那么受欢迎,很大部分是因为他的强大的插件库,还要譬如就是大家
- 一般的网站会有很多页面,面包屑导航可以大大改善用户寻找他们的路径的方法。就可用性而言,面包屑可以减少一个网站的用户返回上一级页面的操作次数,
- python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象。。。。。。我们通
- 这里还以前面的微博为例,我们知道拖动刷新的内容由Ajax加载,而且页面的URL没有变化,那么应该到哪里去查看这些Ajax请求呢?1. 查看请
- 当你使用Lumigent log Explorer连接服务器后,选择具体的数据库实例时报错,提示 &nbs