1. 程式人生 > 其它 >python + selenium + PhantomJS 獲取騰訊應用寶APP評論

python + selenium + PhantomJS 獲取騰訊應用寶APP評論

PhantomJS

PhantomJS 是一個基於WebKit的伺服器端JavaScript API,它無需瀏覽器的支援即可實現對Web的支援,且原生支援各種Web標準,如DOM 處理、JavaScript、CSS選擇器、JSON、Canvas和可縮放向量圖形SVG。PhantomJS主要是通過JavaScript和 CoffeeScript控制WebKit的CSS選擇器、可縮放向量圖形SVG和HTTP網路等各個模組。PhantomJS主要支援Windows、 Mac OS、Linux三個平臺,並且提供了對應的二進位制安裝包。

PhantomJS 的使用場景如下:

  • 無需瀏覽器的Web測試:無需瀏覽器的情況下進行快速的Web測試,且支援很多測試框架,如YUI Test、Jasmine、WebDriver、Capybara、QUnit、Mocha等。
  • 頁面自動化操作:使用標準的DOM API或一些JavaScript框架(如jQuery)訪問和操作Web頁面。
  • 螢幕捕獲:以程式設計方式抓起CSS、SVG和Canvas等頁面內容,即可實現網路爬蟲應用。構建服務端Web圖形應用,如截圖服務、向量光柵圖應用。
  • 網路監控:自動進行網路效能監控、跟蹤頁面載入情況以及將相關監控的資訊以標準的HAR格式匯出。

PhantomJS 已形成了一個功能非常強大的生態圈內容,相關專案如下:

  • CasperJS:一個開源的導航指令碼處理和高階測試工具
  • Poltergeist :測試工具Capybara的測試驅動
  • Guard::Jasmine:能夠基於Rails實現自動化測試Jasmine的Specs
  • GhostDriver:遠端 WebDriver 有線協議的開源實現
  • PhantomRobot:PhantomJS機器人測試框架
  • Mocha-PhantomJS:JavaScript測試框架Mocha的客戶端

此 外,生態圈還包括基於PhantomJS實現了眾多截圖工具,如capturejs、pageres、phantomjs-screenshots、 manet、screenshot-app等;以及Node.js、Django、PHP、Sinatra等語言的截圖API和Confess、 GhostStory、Grover等眾多工具。

下載地址:

http://phantomjs.org/download.html

程式碼樣例:

 1 #/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 
 4 from selenium import webdriver
 5 import time
 6 import xlsxwriter
 7 import json
 8 
 9 def main(url):
10 
11     driver = webdriver.PhantomJS()
12     driver.get(url)
13     time.sleep(5)
14 
15     with open("./tencent_yyb.json", "wb") as write_obj:
16         try:
17             # numstr = driver.find_elements_by_xpath('//*[@id="J_CommentCount"]')[0].text
18             # num = int(numstr[1:4])
19             flag = True
20             while flag:  # 迴圈,無法點選“檢視更多評論”報錯,重置標誌位flag完成獲取所有內容
21                 try:
22                     driver.find_element_by_id("J_DetCommentShowMoreBtn").click()  # 點選“檢視更多評論”
23                     #driver.implicitly_wait(10)
24                     time.sleep(1)
25                 except Exception as err:
26                     print err
27                     flag = False
28 
29             data = driver.find_elements_by_xpath('//*[@id="J_DetDataContainer"]/div/div[8]/ul/li')
30 
31             repeat = {}  # 快取資料
32             for item in data:
33                 val_list = item.text.split('n')
34                 if len(val_list) == 3:
35                     ptime = val_list[1].encode("utf-8")
36                     pcontent = val_list[2].encode("utf-8")
37                     if ptime not in repeat.keys():  # 去重
38                         repeat[ptime] = pcontent
39                         write_obj.write("{"釋出時間":"" + ptime + "", "釋出內容":"" + pcontent + ""}n" )
40                 else:
41                     ptime = val_list[1].encode("utf-8")
42                     pcontent = ' '
43                     if ptime not in repeat.keys():
44                         repeat[ptime] = pcontent
45                         write_obj.write("{"釋出時間":"" + ptime + "", "釋出內容":"" + pcontent + ""}n" )
46         except Exception as err:
47             print err
48         finally:
49             driver.quit()
50 
51 def get_num(name):
52     jfilename = "./" + name + ".json"
53     count = len(open(jfilename, "rU").readlines()) - 1
54     return count
55 
56 # xls轉換寫入
57 def w_xls(url, name):
58     perfix = time.strftime('%Y%m%d')
59     xfilename = "./" + name + '_' + perfix + ".xlsx"
60     jfilename = "./" + name + ".json"
61     workbook = xlsxwriter.Workbook(xfilename)
62     worksheet1 = workbook.add_worksheet()
63     lines = int(get_num(name))
64     worksheet1.set_column = ('A:C', lines+1)
65     worksheet1.write('A1', 'URL')
66     worksheet1.write('B1', u'釋出時間')
67     worksheet1.write('C1', u'釋出內容')
68 
69     row = 1
70     with open(jfilename, "r") as obj_read:
71         for line in obj_read.readlines():
72             data = json.loads(line)
73             worksheet1.write(row, 0, url)
74             worksheet1.write(row, 1, data[u'釋出時間'])
75             worksheet1.write(row, 2, data[u'釋出內容'])
76             row += 1
77 
78 
79 if __name__ == '__main__':
80 
81     url = ''
82 
83     main(url)
84     time.sleep(3)
85     w_xls(url, "tencent_yyb")