對(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') 用戶信息讀取出來后就可以登錄了 有些盆友用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) 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, 這里有一個(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); 把它寫成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 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 = { 將需要的說說數(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: 將需要的說說數(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/') 4.分析數(shù)據(jù) 24小時(shí)發(fā)布的說說數(shù) 大家在中午和晚上發(fā)布的說說比較多,凌晨比較少 說說最多排行top20
說說最少排行top20
果然,,悶騷的人發(fā)的說說比較多。。。哈哈哈 從2000年到2018年,說說分布如下 看來我的朋友們年輕的時(shí)候蠻悶騷,,隨著年紀(jì)增大,,說說越來越少。。
數(shù)據(jù)抓取速度賊快,,20分鐘抓取了我所有好友(282+)60000+說說。。 項(xiàng)目已傳到
|
|