前言
虽然扒qq空间不是很地道,但咱还是干干吧……正好也是闲来无事,我这个应该不会被别人发现 tao)
技术路线
selenium + beautifulsoup + pyautogui + echarts
selenium模拟浏览器
beautifulsoup解析文本
pyautogui 负责下拉
echarts 可视化图像
需要注意的点
QQ空间在加载的时候,是一部分一部分加载的。也就是说当下拉到最底的时候,才可以在网页中刷新出来新的内容,并且一部分说说消除掉。
如下图
下拉后
注:一个ul对应着一组说说
代码
了解了上面的现在就开始写代码
代码结构:
QQ空间解析
- main.py
- jiexi.py
- data_conversion.py
- visualization.py
- data
第一步 爬取说说&解析文本
# QQ空间解析/main.py
# encoding=utf-8
from selenium.webdriver import Edge
import time
import jiexi
import pyautogui
driver = Edge()
# yourqq写你的QQ号
driver.get("https://user.qzone.qq.com/yourqq/infocenter")
time.sleep(10) #在这10s内你要人工登录
for i in range(10000):
time.sleep(1)
html=driver.find_element_by_xpath("//*").get_attribute("outerHTML")
# 解析html
jiexi.get(html)
pyautogui.scroll(-7500)
# 向下滑动
# time.sleep(1)
driver.close()
解析文本部分
# QQ空间解析/jiexi.py
#encoding = utf-8
from bs4 import BeautifulSoup as BS
import re
# 正则表达式进行匹配
def getText(match,text,group=1):
tmp=re.search(match,text,re.S)
if (tmp==None):
return ""
else:
return tmp.group(group)
def get(html):
soup=BS(html,"html.parser")
shuoshuos=soup.find_all(name="li",attrs={"class":"f-single f-s-s"})
for i in range(len(shuoshuos)):
text=shuoshuos[i].get_text()
user=getText(r" (.*?)[ , ].*(\d\d:\d\d)",text)
time=getText(r" (.*?)[ , ].*(\d\d:\d\d)",text,group=2)
llcs=getText(r"浏览(\d*?)次",text)
haoyou=getText(r"\+1(.*?)[共,等](\d+)人觉得很赞",text).split("、")
likes=getText(r"\+1(.*?)[共,等](\d+)人觉得很赞",text,group=2)
dic={"user":user,"time":time,"llcs":llcs,"haoyou":haoyou,"likes":likes}
# print("data/"+user+time+".txt")
#在data文件夹下面保存
with open("data/"+user+time.replace(":","")+".txt","w",encoding="utf-8") as f:
f.write(str(dic))
然后运行main.py,然后可能需要你登录一下,让她爬一段时间(几个小时)。然后大功告成!
下图是data文件夹下面的一些生成txt文件
txt内部内容
分别对应
- QQ昵称
- 发送时间
- 浏览量
- 部分点赞好友
- 点赞数量
QQ说说具体内容我没爬,毕竟还是别啥都爬 /脸红
然后做一个数据可视化。我感觉还算是很绚丽的哦。
第二步 数据可视化1 数据处理
# QQ空间解析/data_conversion.py
import glob
filelist=glob.glob("data/*.txt")
dic={};
for file in filelist:
with open(file,"r",encoding="utf-8") as f:
d=eval(f.read())
if (dic.get(d["user"])==None):
dic[d["user"]]={}
for haoyou in d["haoyou"]:
if dic[d["user"]].get(haoyou)==None:
dic[d["user"]][haoyou]=1
else:
dic[d["user"]][haoyou]=dic[d["user"]][haoyou]+1
l = []
for key in dic:
if key == '':
continue
for key2 in dic[key]:
if key2 == "":
continue
l.append([key,key2,dic[key][key2]])
#key 收到 key2 dic[key][key2] 次点赞
with open("list.txt","w",encoding="utf-8") as f:
f.write(str(l))
生成一个list.txt,里面记录着一个比较大的列表。
第三步 数据可视化2 利用echart构建图
接下来我们用echarts进行数据可视化
# QQ空间解析/visualization.py
from pyecharts.charts.basic_charts.graph import Graph
links = []
nodes = []
with open("list.txt","r",encoding="utf-8") as f:
tmp = eval(f.read())
dic = {}
for item in tmp:
dic[item[0]] = dic.get(item[0],1) + item[2]
dic[item[1]] = dic.get(item[1],1)
links.append({"source":item[1],"target":item[0],"value":item[2]})
for key in dic:
nodes.append({"name":key,"symbolSize": (dic.get(key,1)+9)//10,"value":dic[key]})
graph = Graph()
graph.add("",nodes,links,
categories=None, # 结点分类的类目,结点可以指定分类,也可以不指定。
is_focusnode=False, # 是否在鼠标移到节点上的时候突出显示节点以及节点的边和邻接节点。默认为 True
is_roam=True,
)
graph.render(r"QQ点赞关系图.html")
最终生成一个html文件,调整宽度和高度。
我把它调成9000px和7000px这样显示的清楚一些(大概对应几百个好友)。
利用chrome浏览器打开这个html文件
- 调整图片大小位置
- F12->ctrl+shift+P->screenshot,点击下面的按钮,过一段事件,可能保存时间有些长,我之前也是试过用另存为图片的方式进行保存图像,但是保存下来的图像是空的,可能是图片太大的原因。(我花了大概30s保存下来,原图大概30多M)
最终呈现的效果如下:
我来解释一下这张图像。
- 点越大说明受到你总点赞量越多(总点赞量:爬取时间段发送的说说数量*平均每条说说在下面显示的点赞人数)。
- 越靠近边缘和你的共同好友越少,越靠近中心和你的共同好友越多。
- 关系比较密切的好友通常聚集着某一个区,例如,高中初中同学集中在上方,大学同学集中在左方等等。
本人菜鸡一枚,感谢各位大佬能看到最后!
哈哈哈哈