#Python爬虫QQ空间好友说说
先看效果:
(轻微马赛克)
我的好友大概接近一百人,这里总共有3.5w+条数据
##具体步骤: ####**问题分析:** - QQ空间是动态网页,那么直接获得网页源码就没戏了,只能通过模拟浏览器 - 访问QQ空间之前需要登陆 - 各个好友的动态访问前,需要获得好友列表 - 爬虫技术不是黑客技术,访问好友的QQ空间需要获得权限 ####**难点分析:** - 好友列表的获取 - 访问请求中g_qzonetoken 和 gtk的获取 - 解析QQ好友的说说 **获取g_tk:** **获取g_qzonetoken:** 完整代码:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import re
def startSpider():
driver = webdriver.Chrome(executable_path=r'C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\Scripts\phantomjs-2.1.1-windows\phantomjs-2.1.1-windows\bin\chromedriver.exe') #这个是chormedriver的地址
driver.get('https://qzone.qq.com/')
driver.switch_to.frame('login_frame')
driver.find_element_by_id('switcher_plogin').click()
driver.find_element_by_id('u').clear()
driver.find_element_by_id('u').send_keys('xxxxx') #这里填写你的QQ号
driver.find_element_by_id('p').clear()
driver.find_element_by_id('p').send_keys('xxxxx') #这里填写你的QQ密码
driver.find_element_by_id('login_button').click()
time.sleep(2)
#f = open('E:/QQ.csv','w',encoding='utf-8')
#---------------获得g_qzonetoken 和 gtk
'''
注意!!!!!!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
--Vision_Tung
2018年10月25日
'''
gtk=getGTK(cookie)#通过getGTK函数计算gtk
print(g_qzonetoken)
print(gtk)
#--------------获得好友列表 注意下面的链接
'''
注意!!!!!!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
--Vision_Tung
2018年10月25日
'''
begin = 0
last_source = ""
tag = 1
first = 0
firstTime=""
for key in numList.keys():
QQnum = key
QQname = numList[QQnum]
begin = 0
first = 0
while tag==1 :
#-------------进入好友说说页面
'''
注意!!!!!!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
--Vision_Tung
2018年10月25日
'''
'''
注意:爬虫不是黑客!!!!
还是要有权限的!!!
'''
#检测是否没有权限访问
'''
注意!!!!!!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
--Vision_Tung
2018年10月25日
'''
#解析JSON
#webDriver没有现成的JSON解析器,所以采用获取源码的方式,然后使用正则表达式获取具体细节
'''
注意!!!!!!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
--Vision_Tung
2018年10月25日
'''
#说说动态分4种:1、文字说说(或带有配图的文字说说)
# 2、只有图片的说说
# 3、转发,并配有文字
# 4、转发,不配文字
for text in msg_list_json:
# 1、先检查说说,用户是否发送了文字,如果没有文字,正则表达式匹配无效
'''
注意!!!!!!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
--Vision_Tung
2018年10月25日
'''
# 2、如果作者说说有文字,那么检查是否有转发内容
'''
注意!!!!!!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
--Vision_Tung
2018年10月25日
'''
#合并发送内容 格式:评论+转发内容
if msg_time2!=[]:
msg = msg +" 转发内容:"+str(msg_time2[0][0])
else:
# 3、说说内容为空,检查是否为 =>只有图片的说说 or 转发,不配文字
#获取正文发送时间 (发送时间分为:正文发送时间 or 转发时间)
abtract_pattern = re.compile('"conlist":null,"content":"","createTime":"(.*?)",',re.S)
msgNull_time = re.findall(abtract_pattern,str(text))
if msgNull_time!=[]:
#如果有正文发送时间,那么就是这条说说仅含有图片 =>只有图片的说说
msg = "图片"
sendTime = str(msgNull_time[0])
else:
#如果没有正文发送时间,那么就是说这条说为 =>转发,不配文字
abtract_pattern = re.compile('\}\],"content":"(.*?)"},"rt_createTime":"(.*?)","',re.S)
msg_time = re.findall(abtract_pattern,str(text))
msg =" 转发内容:"+str(msg_time[0][0])
sendTime = str(msg_time[0][1])
# f.write('{},{},{},{}\n'.format(str(QQname),str(QQnum),sendTime,msg))
print(str(QQname)+" : "+str(QQnum)+" : "+sendTime+" : "+msg)
begin = begin + 40
def getGTK(cookie):
'''
注意!!!!!!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
此块细节已影藏!!!!
--Vision_Tung
2018年10月25日
'''
startSpider()
print("OK")
####总结分析:
- 获取好友动态页面时,会报错,目前无法解决,本人采用异常直接跳过,导致好友动态丢失,但丢失率低,差强人意
- 好友动态页面跨度大(40条/次),可能导致信息丢失,丢失率未统计
####日后改进 计划:
- 实现实时更新
- 获得图片、位置等丰富信息
- 采用合适的JSON解析方法
- 降低对内存消耗
- 多线程加速
注:如有不足,请斧正。