Python爬虫QQ空间好友说说

#Python爬虫QQ空间好友说说
web

先看效果:

(轻微马赛克)
这里写图片描述

个人好友大概接近一百人,这里总共有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_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种:一、文字说说(或带有配图的文字说说)
            #              二、只有图片的说说
            #              三、转发,并配有文字
            #              四、转发,不配文字
                           
            for text in msg_list_json:
                # 一、先检查说说,用户是否发送了文字,若是没有文字,正则表达式匹配无效
               
        '''
            注意!!!!!!!!!
            此块细节已影藏!!!!
            此块细节已影藏!!!!
            此块细节已影藏!!!!
            此块细节已影藏!!!!
            此块细节已影藏!!!!
            此块细节已影藏!!!!
                            --Vision_Tung
                                2018年10月25日

        '''
                    # 二、若是做者说说有文字,那么检查是否有转发内容
                   
        '''
            注意!!!!!!!!!
            此块细节已影藏!!!!
            此块细节已影藏!!!!
            此块细节已影藏!!!!
            此块细节已影藏!!!!
            此块细节已影藏!!!!
            此块细节已影藏!!!!
                            --Vision_Tung
                                2018年10月25日

        '''
                    #合并发送内容 格式:评论+转发内容
                    if msg_time2!=[]:
                        msg = msg +"  转发内容:"+str(msg_time2[0][0])
                       
                else:
                    # 三、说说内容为空,检查是否为 =>只有图片的说说 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条/次),可能致使信息丢失,丢失率未统计

####往后改进 计划:chrome

  • 实现实时更新
  • 得到图片、位置等丰富信息
  • 采用合适的JSON解析方法
  • 下降对内存消耗
  • 多线程加速

注:若有不足,请斧正。json