成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

[Python]消失在QQ空間里的青春

開發 后端 移動開發
QQ空間,這個曾經陪我們從童年到少年再到成年,從2G時代再到如今的4G末,占據了我們太多的青春回憶,如今好友空間動態更新的不在像從前那樣頻繁。

QQ空間,這個曾經陪我們從童年到少年再到成年,從2G時代再到如今的4G末,占據了我們太多的青春回憶,如今好友空間動態更新的不在像從前那樣頻繁。依稀記得當年的好友買賣,搶車位再或者情侶空間,現在想想那時候真的很幼稚,那就是我們傻逼的童年,什么互踩,火星文,跑堂見證了我們無憂無慮的童年。

有時候看看QQ推送的"那年今日",看到自己好幾年前發的動態,說的傻話,自己都怕了自己。有時候看到好朋友幾年前的動態,不由笑罵道,這孫子,怎么這么2! 即使現在不怎么用QQ了,有時候看看曾經發的說說還有空間的留言。即使讓我再尷尬也不舍得刪,因為那都是青春滿滿的回憶。

空間留言上千條,說說也比較多,一頁一頁的翻比較麻煩。索性就把這些數據都下載到本地。同理我們也可以導出全部聯系人的說說和留言板。

Selenium

由于訪問好友留言板需要登錄,為了方便起見我們使用Web應用程序測試的Selenium工具。該工具可以用于單元測試,集成測試,系統測試等等。它可以像真正的用戶一樣去操作瀏覽器等,支持Mozilla Firefox、Google Chrome、Safari、Opera、IE等等瀏覽器。

使用這個工具之前我們需要安裝selenium庫和下載相應瀏覽器的驅動。然后通過分析QQ空間登錄界面我們發現默認是掃碼登錄,因此需要切換成賬號密碼登錄。

[Python]消失在QQ空間里的青春

通過分析html標簽屬性,我們發現 id="switcher_plogin",是個切換登錄的全局唯一屬性。同理我們再需要找到賬號、密碼輸入框和點擊登錄的元素就可以用selenium模擬登錄了

[Python]消失在QQ空間里的青春

登錄部分代碼如下:

  1. from selenium import webdriver 
  2.  
  3. driver = webdriver.Chrome() 
  4.     # 獲取谷歌瀏覽器驅動 
  5.     driver = webdriver.Chrome() 
  6.     # 登錄網站 
  7.     driver.get('https://i.qq.com'
  8.     # 選擇賬號密碼登錄 
  9.     driver.switch_to_frame('login_frame'
  10.     # 點擊輸入框獲取輸入 
  11.     driver.find_element_by_id('switcher_plogin').click() 
  12.     # 輸入賬號 
  13.     driver.find_element_by_id('u').send_keys('你的qq號'
  14.     # 輸入密碼 
  15.     driver.find_element_by_id('p').send_keys('qq密碼'
  16.     # 點擊登錄 
  17.     driver.find_element_by_id('login_button').click() 

工作前的參數準備

通過查看開發者工具中的請求我們發現,登錄之后每次請求除了攜帶必要的參數以外,還攜帶了登錄獲取的token和g_tk。token我們可以從網頁源代碼中直接獲取,但是g_tk在源代碼中沒有,根據以往經驗第一步只能從js中查看,果然發現了一段加密代碼,再結合上下文發現是從cookie中取出“p_skey”的值再經過一系列操作就是g_tk的值了。因為我們需要先獲取cookie,然后再通過cookie獲取g_tk。

[Python]消失在QQ空間里的青春

部分js加密邏輯代碼

  1. if (e) { 
  2.      if (e.host && e.host.indexOf("qzone.qq.com") > 0) { 
  3.         try { 
  4.            t = parent.QZFL.cookie.get("p_skey"
  5.         } catch(e) { 
  6.            t = QZFL.cookie.get("p_skey"
  7.         } 
  8.      }  
  9.         ............ 
  10.   } 
  11.  
  12. "g_tk=" + QZFL.pluginsDefine.getACSRFToken(t) 
  13.  
  14. QZFL.pluginsDefine.getACSRFToken._DJB = function(e) { 
  15.         var t = 5381; 
  16.         for (var n = 0, 
  17.         r = e.length; n < r; ++n) { 
  18.             t += (t << 5) + e.charCodeAt(n) 
  19.         } 
  20.         return t & 2147483647 
  21.     }; 

獲取token && cookie && g_tk代碼

  1. ""
  2.  獲取g_tk的值 
  3. ""
  4. def get_g_tk(cookie): 
  5.     hashes = 5381 
  6.     for letter in cookie['p_skey']: 
  7.         hashes += (hashes << 5) + ord(letter) 
  8.     return hashes & 0x7fffffff 
  9.  
  10. # 獲取登錄之后的cookie信息 
  11. cookie = {} 
  12. for elem in driver.get_cookies(): 
  13.     cookie[elem['name']] = elem['value'
  14. # 獲取g_tk 
  15. g_tk = get_g_tk(cookie) 
  16. # 利用xpath獲取登錄之后的網頁源代碼 
  17. html = driver.page_source 
  18. xpath = r'window\.g_qzonetoken = \(function\(\)\{ try\{return "(.*?)";}' 
  19. # 通過xpath 獲得登錄后的token 
  20. token = re.compile(xpath).findall(html)[0] 

開始搞事

破解了一個簡單的反爬蟲,下面就可以編寫正式的爬蟲代碼了,首先確定我們目標url、通過瀏覽器分析響應的json對象、編寫headers

因為每次請求都需要攜帶登錄信息,為了方便我們用到了session類,其次觀察相應我們發現返回的response有無用的字符,因此需要進行截取

[Python]消失在QQ空間里的青春

  1. headers = { 
  2.     'authority''user.qzone.qq.com'
  3.     'method''GET'
  4.     'scheme''https'
  5.     'accept-language''zh-CN,zh;q=0.9'
  6.     'user-agent''Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
  7.  
  8. def get_resp(cookie, g_tk, token, page): 
  9.     session = requests.session() 
  10.     # 將cookie字典轉換成RequestsCookieJar 
  11.     c = requests.utils.cookiejar_from_dict(cookie) 
  12.     # 將headers 放入session 
  13.     session.headers = headers 
  14.     # RequestsCookieJar復制給session 
  15.     session.cookies = c 
  16.     # 訪問留言板的url 
  17.     url = f'https://user.qzone.qq.com/proxy/domain/m.qzone.qq.com/cgi-bin/new/get_msgb?uin={登陸的qq}&hostUin={要查詢留言內容的QQ號}&start={page}&num=10&g_tk={g_tk}&qzonetoken={token}' 
  18.     print(url) 
  19.     response = session.get(url) 
  20.     # 截取無用的字符 
  21.     resp_text = response.text[10: -3] 
  22.     # 轉為json 
  23.     resp_json = json.loads(resp_text) 
  24.     return resp_json 

上面的方法,只是獲得了某一頁的接口相應,我們通過json獲取留言總數,再除以每頁的條數,就可以知道總頁數了。然后再遍歷去取每頁的數據,為了方便查看將數據保存在csv文件中,另外將留言內容保存在txt文件中,生成詞云。

  1. def get_zone_xx(cookie, g_tk, token, page=0): 
  2.     # 初始化請求為了取總條數 
  3.     resp_json = get_resp(cookie, g_tk, token, page) 
  4.     # 總條數 
  5.     total = resp_json['data']['total'
  6.     print(f'共{total}條留言信息'
  7.     # 總頁數 
  8.     size = int(total/10 + 1) 
  9.     # 已經讀取的信息條數 
  10.     use_page = 0 
  11.     # 保存每條數據信息,生成csv文件用 
  12.     content_arr = [] 
  13.     for i in range(0, size): 
  14.         # 請求每一頁的內容 
  15.         resp_json = get_resp(cookie, g_tk, token, i) 
  16.         # 當條數大于或等于總條數 跳出循環 
  17.         if use_page >= total: 
  18.             break 
  19.         # 從每頁數據中取出需要的字段值 
  20.         for comment in resp_json['data']['commentList']: 
  21.             use_page += 1 
  22.             print(f'當前正在讀取第{use_page}條'
  23.             page_json = [] 
  24.             # 留言日期 
  25.             page_json.append(comment['pubtime']) 
  26.             # 昵稱 
  27.             page_json.append(comment['nickname']) 
  28.             # 內容 
  29.             content = replace_html(comment['htmlContent']) 
  30.             # 將內容寫入文本 生成詞云用 
  31.             with open('zone_text111.txt''a'as f: 
  32.                 f.write(content) 
  33.  
  34.             page_json.append(content) 
  35.             content_arr.append(page_json) 

生成csv文件

  1. # 將總數據轉化為data frame再輸出 
  2.  df = pd.DataFrame(data=content_arr, 
  3.                    columns=['留言日期''昵稱''留言內容']) 
  4.  df.to_csv('QQ_ZONE.csv'index=False, encoding='utf-8_sig'
  5.  print('已保存為csv文件.'

運行上面代碼生成csv文件部分內容如下

[Python]消失在QQ空間里的青春

生成詞云(wordcloud)代碼如下

  1. from wordcloud import WordCloud 
  2. import matplotlib.pyplot as plt 
  3. with open('zone_text.txt','r'as f: 
  4.     mytext = f.read() 
  5.  
  6. font = r'C:\Windows\Fonts\simfang.ttf' 
  7. wc = WordCloud(collocations=False, font_path=font, width=1400, height=1400, margin=2).generate(mytext) 
  8. plt.imshow(wc) 
  9. plt.axis("off"
  10. plt.show() 
  11.  
  12. plt.show() 

運行結果如下:

[Python]消失在QQ空間里的青春

寫在最后

上面的代碼并沒有太復雜,也許是觸景生情,也許是對現在朋友圈各種亂七八糟的信息產生了抵觸,所以試著去回憶青春的那些往事。

朋友圈和空間并不能去衡量一個人是是否成熟,但是對于大部分90后來說,空間真的是承載了太多純真的回憶。不忘初心,砥礪前行!!!

責任編輯:未麗燕 來源: 程序員共成長
相關推薦

2011-09-14 10:51:34

服務器網絡布線APC

2021-05-05 14:00:25

QQ手機QQ移動應用

2015-04-28 13:34:52

phpqq空間發表文章

2009-12-11 14:17:05

Linux平臺空間消失

2015-12-28 13:30:17

模塊化數據中心

2015-09-09 11:08:48

qq空間可拉伸頭部

2017-03-18 13:55:00

機器人工作

2019-05-29 21:21:42

QQH5營銷情懷

2015-08-07 15:32:19

歡迎界面仿微信仿qq空間

2009-05-22 10:11:19

2019-08-16 17:14:28

跳槽那些事兒技術Linux

2019-08-27 10:49:30

跳槽那些事兒技術Linux

2017-09-06 15:58:10

華碩商用本

2017-11-02 15:08:23

智能

2018-09-26 17:33:37

機器學習人工智能計算機

2012-05-15 16:00:35

小米

2019-10-11 16:29:38

程序員

2021-06-10 06:15:41

程序員學歷互聯網

2015-10-27 11:14:03

qq騰訊95后
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费在线一区二区 | 欧美涩 | 91精品入口蜜桃 | 欧美在线国产精品 | 亚洲成人一级片 | 亚洲精品电影 | 日韩一区二区三区视频在线播放 | 亚洲一区视频 | 午夜影院污 | 国产精品1区 | 久久久国产精品网站 | 日韩一区二区在线视频 | 欧美视频偷拍 | 九九热九九| 欧美日本在线观看 | 欧美国产日韩一区 | 成人在线网址 | 在线日韩福利 | 国产一区二区三区 | 国产黄色在线观看 | 国产精品1区2区3区 国产在线观看一区 | 日本一本在线 | 红色av社区 | 精品成人佐山爱一区二区 | 国产精品一区二区三区四区 | 毛片免费在线 | 一区二区三区亚洲 | 日韩在线看片 | 一级免费视频 | 一区二区三区在线 | 超级碰在线 | 一级毛片在线看 | 欧美精品在线免费观看 | 99av成人精品国语自产拍 | 精品蜜桃一区二区三区 | 黄篇网址 | 福利网站导航 | 免费一级欧美在线观看视频 | 成年人在线播放 | 九九导航| 放个毛片看看 |