#Python爬虫QQ空间好友说说
先看效果:
(轻微马赛克)我的好友大概接近一百人,这里总共有3.5w+条数据
##具体步骤: ####**问题分析:** - QQ空间是动态网页,那么直接获得网页源码就没戏了,只能通过模拟浏览器 - 访问QQ空间之前需要登陆 - 各个好友的动态访问前,需要获得好友列表 - 爬虫技术不是黑客技术,访问好友的QQ空间需要获得权限 ####**难点分析:** - 好友列表的获取 - 访问请求中g_qzonetoken 和 gtk的获取 - 解析QQ好友的说说 **获取g_tk:**http://blog.csdn.net/vision_tung/article/details/78888695 **获取g_qzonetoken:**http://blog.csdn.net/vision_tung/article/details/78888639 完整代码: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_Tung2018年10月25日'''gtk=getGTK(cookie)#通过getGTK函数计算gtkprint(g_qzonetoken)print(gtk)#--------------获得好友列表 注意下面的链接'''注意!!!!!!!!!此块细节已影藏!!!!此块细节已影藏!!!!此块细节已影藏!!!!此块细节已影藏!!!!此块细节已影藏!!!!此块细节已影藏!!!!--Vision_Tung2018年10月25日'''begin = 0last_source = ""tag = 1first = 0firstTime=""for key in numList.keys():QQnum = key QQname = numList[QQnum]begin = 0first = 0while tag==1 :#-------------进入好友说说页面'''注意!!!!!!!!!此块细节已影藏!!!!此块细节已影藏!!!!此块细节已影藏!!!!此块细节已影藏!!!!此块细节已影藏!!!!此块细节已影藏!!!!--Vision_Tung2018年10月25日''''''注意:爬虫不是黑客!!!!还是要有权限的!!!'''#检测是否没有权限访问'''注意!!!!!!!!!此块细节已影藏!!!!此块细节已影藏!!!!此块细节已影藏!!!!此块细节已影藏!!!!此块细节已影藏!!!!此块细节已影藏!!!!--Vision_Tung2018年10月25日'''#解析JSON#webDriver没有现成的JSON解析器,所以采用获取源码的方式,然后使用正则表达式获取具体细节'''注意!!!!!!!!!此块细节已影藏!!!!此块细节已影藏!!!!此块细节已影藏!!!!此块细节已影藏!!!!此块细节已影藏!!!!此块细节已影藏!!!!--Vision_Tung2018年10月25日'''#说说动态分4种:1、文字说说(或带有配图的文字说说)# 2、只有图片的说说# 3、转发,并配有文字# 4、转发,不配文字for text in msg_list_json:# 1、先检查说说,用户是否发送了文字,如果没有文字,正则表达式匹配无效'''注意!!!!!!!!!此块细节已影藏!!!!此块细节已影藏!!!!此块细节已影藏!!!!此块细节已影藏!!!!此块细节已影藏!!!!此块细节已影藏!!!!--Vision_Tung2018年10月25日'''# 2、如果作者说说有文字,那么检查是否有转发内容'''注意!!!!!!!!!此块细节已影藏!!!!此块细节已影藏!!!!此块细节已影藏!!!!此块细节已影藏!!!!此块细节已影藏!!!!此块细节已影藏!!!!--Vision_Tung2018年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_Tung2018年10月25日'''
startSpider()
print("OK")
####总结分析:
- 获取好友动态页面时,会报错,目前无法解决,本人采用异常直接跳过,导致好友动态丢失,但丢失率低,差强人意
- 好友动态页面跨度大(40条/次),可能导致信息丢失,丢失率未统计
####日后改进 计划:
- 实现实时更新
- 获得图片、位置等丰富信息
- 采用合适的JSON解析方法
- 降低对内存消耗
- 多线程加速
注:如有不足,请斧正。