一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

抓取60000 QQ空間說說做一次數(shù)據(jù)分析

 長沙7喜 2017-12-29


對(duì)于QQ空間的數(shù)據(jù)一直來是垂涎不已,老早就想偷過來研究研究,這幾天閑下來便開始動(dòng)手!

整個(gè)程序的流程為:登錄-->獲取cookie-->獲取所有的好友qq_number-->根據(jù)所有的好友qq遍歷他們的說說-->get所有好友的說說數(shù)據(jù)

程序跑了20多分鐘就跑完了,,共282好友,,跑了60000+說說

有些個(gè)人隱私我抹掉了...甭介意...嘿嘿


1.登錄-->獲取cookie

打開http://i.qq.com/,如下圖

但大多數(shù)時(shí)候是這樣的

我們這里使用賬號(hào)密碼登錄,為了方便使用selenium自動(dòng)化神器(關(guān)于selenium的用法可以參考https://my.oschina.net/u/3264690/blog/899229,這里不做過多闡述)

QQ賬號(hào),QQ密碼存儲(chǔ)在userinfo.ini文件中,然后用configparser將其讀取出來

讀取的代碼如下

configparser是一個(gè)讀取配置文件的庫,這里讀取的格式為get('[配置文件中括號(hào)里的值]',‘相對(duì)應(yīng)的key值’)

import configparserconfig = configparser.ConfigParser(allow_no_value=False)config.read('userinfo.ini')
self.__username =config.get('qq_info','qq_number')
self.__password=config.get('qq_info','qq_password')

用戶信息讀取出來后就可以登錄了

有些盆友用selenium的時(shí)候,可能會(huì)發(fā)現(xiàn)有些元素定位不到,這是因?yàn)橛行┚W(wǎng)頁套了一個(gè)iFrame

selenium根據(jù)id定位到該iframe

self.web.switch_to_frame('login_frame')


自動(dòng)登錄且獲取cookie的代碼

   def login(self):        self.web.switch_to_frame('login_frame')        log=self.web.find_element_by_id('switcher_plogin')        log.click()        time.sleep(1)        username=self.web.find_element_by_id('u')        username.send_keys(self.__username)        ps=self.web.find_element_by_id('p')        ps.send_keys(self.__password)        btn=self.web.find_element_by_id('login_button')        time.sleep(1)        btn.click()        time.sleep(2)        
         self.web.get('https://user.qzone.qq.com/{}'.format(self.__username))        cookie=''        for elem in self.web.get_cookies():            cookie+=elem['name']+'='+ elem['value']+';'        self.cookies=cookie        
         self.get_g_tk()        
         self.headers['Cookie']=self.cookies        
         self.web.quit()        


2.獲取所有好友的QQ_number

研究好久后發(fā)現(xiàn)在QQ空間主頁中權(quán)限設(shè)置頁面中,點(diǎn)擊僅限QQ好友,會(huì)有下面這樣的頁面出來

按F12后研究js文件發(fā)現(xiàn)有這樣一個(gè)文件

這個(gè)js文件里有好友的qq_number

于是請(qǐng)求這個(gè)文件得到qq_number

   def get_frends_url(self):        url='https://h5.qzone.qq.com/proxy/domain/base.qzone.qq.com/cgi-bin/right/get_entryuinlist.cgi?'        params = {'uin': self.__username,      
           'fupdate': 1,              
           'action': 1,              
           'g_tk': self.g_tk}        url = url + parse.urlencode(params)        
       return url
       
    def get_frends_num(self):        t=True        offset=0        url=self.get_frends_url()        
         while(t):           url_=url+'&offset='+str(offset)           page=self.req.get(url=url_,headers=self.headers)            
             if '\'uinlist\':[]' in page.text:                t=False           else:          
             
               if not os.path.exists('./frends/'):                os.mkdir('frends/')                
               with open('./frends/'+str(offset)+'.json','w',encoding='utf-8') as w:                w.write(page.text)             offset += 50


這里有一個(gè)函數(shù)self.g_tk()它返回一個(gè)加密的p_skey , 在這個(gè)js文件中qzfl_v8_2.1.61.js,有這樣一段代碼

 QZFL.pluginsDefine.getACSRFToken = function(url) {    url = QZFL.util.URI(url);    
   var skey;    
   if (url) {    
    if (url.host && url.host.indexOf('qzone.qq.com') > 0) {      
      try {        skey = parent.QZFL.cookie.get('p_skey');      } catch (err) {        skey = QZFL.cookie.get('p_skey');      }     } else {  
      if (url.host && url.host.indexOf('qq.com') > 0) {        skey = QZFL.cookie.get('skey');      }     }   }    
  if (!skey) {     skey = QZFL.cookie.get('p_skey') || (QZFL.cookie.get('skey') || (QZFL.cookie.get('rv2') || ''));   }    
  return arguments.callee._DJB(skey);  };  QZFL.pluginsDefine.getACSRFToken._DJB = function(str) {    
   var hash = 5381;    
   for (var i = 0, len = str.length;i < len;++i)="" {=""  =""  ="" hash="" +="(hash"><>5) + str.charCodeAt(i);    }    
   return hash & 2147483647;  };

把它寫成python版的如下

   def get_g_tk(self):        p_skey = self.cookies[self.cookies.find('p_skey=')+7: self.cookies.find(';', self.cookies.find('p_skey='))]        h=5381        for i in p_skey:            h+=(h5)+ord(i)        print('g_tk',h&2147483647)        self.g_tk=h&2147483647

因?yàn)閷⒑糜研畔⒋鎯?chǔ)為json文件,因此需要解析文件信息

#coding:utf-8
import json
import os
def get_Frends_list():   k = 0   file_list=[i for i in os.listdir('./frends/') if i.endswith('json')]   frends_list=[]    
   for f in file_list:  
     with open('./frends/{}'.format(f),'r',encoding='utf-8') as w:        data=w.read()[95:-5]        js=json.loads(data)        
        # print(js)        for i in js:           k+=1           frends_list.append(i)    
    return frends_listfrends_list=get_Frends_list()print(frends_list)


3.獲取所有好友說說

與之前類似,進(jìn)入好友的說說主頁后發(fā)現(xiàn)也有這樣一個(gè)js文件將所有說說以json形式顯示出來

類似的,寫了獲取說說的代碼(經(jīng)過測試,參數(shù)中的num最好寫20,否則會(huì)出現(xiàn)未知的結(jié)果。。。)

   def get_mood_url(self):       url='https://h5.qzone.qq.com/proxy/domain/taotao.qq.com/cgi-bin/emotion_cgi_msglist_v6?'       params = {        
          'sort':0,              
             'start':0,            
          'num':20,            
         'cgi_host': 'http://taotao.qq.com/cgi-bin/emotion_cgi_msglist_v6',              
           'replynum':100,              
           'callback':'_preloadCallback',              
           'code_version':1,            
          'inCharset': 'utf-8',            
          'outCharset': 'utf-8',            
          'notice': 0,        
           'format':'jsonp',              
           'need_private_comment':1,              
           'g_tk': self.g_tk            }        url = url + parse.urlencode(params)        
        return url
        
     def get_mood_detail(self):        from getFrends import frends_list        url = self.get_mood_url()        
         for u in frends_list[245:]:           t = True           QQ_number=u['data']           url_ = url + '&uin=' + str(QQ_number)           pos = 0           while (t):             url__ = url_ + '&pos=' + str(pos)             mood_detail = self.req.get(url=url__, headers=self.headers)             print(QQ_number,u['label'],pos)                
             if '\'msglist\':null' in mood_detail.text or '\'message\':\'對(duì)不起,主人設(shè)置了保密,您沒有權(quán)限查看\'' in mood_detail.text:               t = False             else:              
                if not os.path.exists('./mood_detail/'):                  os.mkdir('mood_detail/')                    
                if not os.path.exists('./mood_detail/'+u['label']):                  os.mkdir('mood_detail/'+u['label'])                    
                with open('./mood_detail/'+u['label']+'/' +str(QQ_number)+'_'+ str(pos) + '.json', 'w',encoding='utf-8') as w:                  w.write(mood_detail.text)                pos += 20            time.sleep(2)

將需要的說說數(shù)據(jù)存入數(shù)據(jù)庫

#存入數(shù)據(jù)庫def dataToMysql():    con=pymysql.connect(        host='127.0.0.1',        user='root',        password='×××',        database='qq_z',        port=3306,    )    cur=con.cursor()    sql='insert into info (qq_number,created_time,content,commentlist,source_name,cmtnum,name) values ({},{},{},{},{},{},{});'    d=[i for i in os.listdir('mood_detail') if not i.endswith('.xls')]    for ii in d:        fl=[i for i in os.listdir('mood_detail/'+ii) if i.endswith('.json')]        print('mood_detail/'+ii)        k=1        for i in fl:        
             with open('mood_detail/'+ii+'/'+i,'r',encoding='latin-1') as w:             s=w.read()[17:-2]             js=json.loads(s)             print(i)                
                for s in js['msglist']:                m=-1                if not s['commentlist']:                  s['commentlist']=list()                cur.execute(sql.format(int(i[:i.find('_')]),s['created_time'],str(s['content']),str([(x['content'],x['createTime2'],x['name'],x['uin']) for x in list(s['commentlist'])]),str(s['source_name']),int(s['cmtnum']),str(s['name'])))                k+=1        con.commit()        con.close()

將需要的說說數(shù)據(jù)存入Excel

def dataToExcel():    d=[i for i in os.listdir('mood_detail') if not i.endswith('.xls')]    for ii in d:        wb=xlwt.Workbook()        sheet=wb.add_sheet('sheet1',cell_overwrite_ok=True)        sheet.write(0,0,'content')        sheet.write(0,1,'createTime')        sheet.write(0,2,'commentlist')        sheet.write(0,3,'source_name')        sheet.write(0,4,'cmtnum')        fl=[i for i in os.listdir('mood_detail/'+ii) if i.endswith('.json')]        print('mood_detail/'+ii)        k=1        for i in fl:            with open('mood_detail/'+ii+'/'+i,'r',encoding='latin-1') as w:                s=w.read()[17:-2]                js=json.loads(s)                print(i)                for s in js['msglist']:                    m=-1                    sheet.write(k,m+1,str(s['content']))                    sheet.write(k,m+2,str(s['createTime']))                    if not s['commentlist']:                        s['commentlist']=list()                    sheet.write(k,m+3,str([(x['content'],x['createTime2'],x['name'],x['uin']) for x in list(s['commentlist'])]))                    sheet.write(k,m+4,str(s['source_name']))                    sheet.write(k,m+5,str(s['cmtnum']))                    k+=1        if not os.path.exists('mood_detail/Excel/'):            os.mkdir('mood_detail/Excel/')        
           try:            wb.save('mood_detail/Excel/'+ii+'.xls')        
           except Exception:            print('error')


4.分析數(shù)據(jù)

24小時(shí)發(fā)布的說說數(shù)

大家在中午和晚上發(fā)布的說說比較多,凌晨比較少

說說最多排行top20

 

說說最少排行top20

 

果然,,悶騷的人發(fā)的說說比較多。。。哈哈哈

從2000年到2018年,說說分布如下

看來我的朋友們年輕的時(shí)候蠻悶騷,,隨著年紀(jì)增大,,說說越來越少。。

感謝https://zhuanlan.zhihu.com/p/24656161給我的提示。。。少走了許多彎路

數(shù)據(jù)抓取速度賊快,,20分鐘抓取了我所有好友(282+)60000+說說。。

項(xiàng)目已傳到

碼云 : https://git.oschina.net/nanxun/QQ_zone.git

github : https://github.com/nanxung/QQ_zone.git

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    国产日韩欧美专区一区| 91欧美日韩中在线视频| 激情五月激情婷婷丁香| 中文字幕五月婷婷免费| 久久亚洲精品成人国产| 亚洲视频一区自拍偷拍另类| 在线日韩中文字幕一区| 九九热精品视频免费观看| 久久青青草原中文字幕| 日韩美成人免费在线视频| 日韩中文字幕欧美亚洲| 色小姐干香蕉在线综合网| 国产欧美日韩精品一区二| 国产精品国产亚洲区久久| 日本一品道在线免费观看| 亚洲天堂精品一区二区| 国产精品推荐在线一区| 日本不卡一区视频欧美| 精品亚洲一区二区三区w竹菊| 国产永久免费高清在线精品| 亚洲欧洲一区二区综合精品| 高清免费在线不卡视频| 久久热中文字幕在线视频| 国产精品免费自拍视频| 精品国产品国语在线不卡| 国产又粗又硬又长又爽的剧情| 丁香六月啪啪激情综合区| 国产麻豆视频一二三区| 欧美一区二区日韩一区二区| 国产农村妇女成人精品| 午夜午夜精品一区二区| 殴美女美女大码性淫生活在线播放| 91天堂素人精品系列全集| 久久精品偷拍视频观看| 亚洲国产婷婷六月丁香| 国产熟女高清一区二区| 精品欧美日韩一区二区三区 | 99日韩在线视频精品免费| 亚洲男女性生活免费视频| 在线观看视频日韩成人| 字幕日本欧美一区二区|