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(' ') 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 + ""} " ) 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 + ""} " ) 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")