PhantomJS
PhantomJS是一个基于WebKit的服务器端JavaScriptAPI,它无需浏览器的支持即可实现对Web的支持,且原生支持各种Web标准,如DOM处理、JavaScript、CSS选择器、JSON、Canvas和可缩放矢量图形SVG。PhantomJS主要是通过JavaScript和CoffeeScript控制WebKit的CSS选择器、可缩放矢量图形SVG和HTTP网络等各个模块。PhantomJS主要支持Windows、MacOS、Linux三个平台,并且提供了对应的二进制安装包。
PhantomJS的使用场景如下:
页面自动化操作:使用标准的DOMAPI或一些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/envpython 2#-*-coding:utf-8-*- 3 4fromseleniumimportwebdriver 5importtime 6importxlsxwriter 7importjson 8 9defmain(url): 10 11driver=webdriver.PhantomJS() 12driver.get(url) 13time.sleep(5) 14 15withopen("./tencent_yyb.json","wb")aswrite_obj: 16try: 17#numstr=driver.find_elements_by_xpath('//*[@id="J_CommentCount"]')[0].text 18#num=int(numstr[1:4]) 19flag=True 20whileflag:#循环,无法点击“查看更多评论”报错,重置标志位flag完成获取所有内容 21try: 22driver.find_element_by_id("J_DetCommentShowMoreBtn").click()#点击“查看更多评论” 23#driver.implicitly_wait(10) 24time.sleep(1) 25exceptExceptionaserr: 26printerr 27flag=False 28 29data=driver.find_elements_by_xpath('//*[@id="J_DetDataContainer"]/div/div[8]/ul/li') 30 31repeat={}#缓存数据 32foritemindata: 33val_list=item.text.split('\n') 34iflen(val_list)==3: 35ptime=val_list[1].encode("utf-8") 36pcontent=val_list[2].encode("utf-8") 37ifptimenotinrepeat.keys():#去重 38repeat[ptime]=pcontent 39write_obj.write("{\"发布时间\":\""+ptime+"\",\"发布内容\":\""+pcontent+"\"}\n") 40else: 41ptime=val_list[1].encode("utf-8") 42pcontent='' 43ifptimenotinrepeat.keys(): 44repeat[ptime]=pcontent 45write_obj.write("{\"发布时间\":\""+ptime+"\",\"发布内容\":\""+pcontent+"\"}\n") 46exceptExceptionaserr: 47printerr 48finally: 49driver.quit() 50 51defget_num(name): 52jfilename="./"+name+".json" 53count=len(open(jfilename,"rU").readlines())-1 54returncount 55 56#xls转换写入 57defw_xls(url,name): 58perfix=time.strftime('%Y%m%d') 59xfilename="./"+name+'_'+perfix+".xlsx" 60jfilename="./"+name+".json" 61workbook=xlsxwriter.Workbook(xfilename) 62worksheet1=workbook.add_worksheet() 63lines=int(get_num(name)) 64worksheet1.set_column=('A:C',lines+1) 65worksheet1.write('A1','URL') 66worksheet1.write('B1',u'发布时间') 67worksheet1.write('C1',u'发布内容') 68 69row=1 70withopen(jfilename,"r")asobj_read: 71forlineinobj_read.readlines(): 72data=json.loads(line) 73worksheet1.write(row,0,url) 74worksheet1.write(row,1,data[u'发布时间']) 75worksheet1.write(row,2,data[u'发布内容']) 76row+=1 77 78 79if__name__=='__main__': 80 81url='' 82 83main(url) 84time.sleep(3) 85w_xls(url,"tencent_yyb") |