Selenium+PhantomJS 实现非html(pdf、图片、apk等)文件下载
来源:互联网 发布:java中跳出for循环 编辑:程序博客网 时间:2024/05/16 07:29
1. 引言:
爬虫要爬取动态页面的信息,采用Selenium+PhantomJS是不错的选择。遗憾的是PhantomJS不能下载非html文件,这多少是个遗憾。
但基于PhantomJS的CasperJS却有下载功能。于是有人分析其中的奥秘[1].
其关键点在于Ajax!
直接用selenium的get()打开下载资源无法获取数据。
2.实现方法:
依照原理,摸索出了“Selenium+PhantomJS 实现非html文件下载”的方法:
from selenium import webdriverfrom selenium.webdriver.common.desired_capabilities import DesiredCapabilities #<strong>From CasperJS code</strong>FuncionsJS = r""" function sendAJAX(url, method, data, async) { var xhr = new XMLHttpRequest(), dataString = "", dataList = []; method = method && method.toUpperCase() || "GET"; xhr.open(method, url, !!async); console.log("Jude-Log sendAJAX(): Using HTTP method: '" + method + "'", "debug"); > xhr.overrideMimeType("text/plain; charset=x-user-defined"); if (method === "POST") { if (typeof data === "object") { for (var k in data) { dataList.push(encodeURIComponent(k) + "=" + encodeURIComponent(data[k].toString())); } dataString = dataList.join('&'); console.log("Jude-Log sendAJAX(): Using request data: '" + dataString + "'", "debug"); } else if (typeof data === "string") { dataString = data; } xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); } xhr.send(method === "POST" ? dataString : null); //console.log("Jude-Log xhr.responseText : " + xhr.responseText); return xhr.responseText;}; function getBinary(url, method, data) { try { return sendAJAX(url, method, data, false); } catch (e) { if (e.name === "NETWORK_ERR" && e.code === 101) { console.log(" Jude-Log getBinary(): Unfortunately, casperjs cannot make cross domain ajax requests", "warning"); } console.log("Jude-Log getBinary(): Error while fetching " + url + ": " + e, "error"); return ""; }};function download(url) { try { return getBinary(url, "GET", ""); } catch (e) { console.log( "Error while downloading %s ", e ); return "Error -_-"; } };//return download("http://www.jb51.net/images/logo.gif" );"""def SaveData(data, targetFile): with open(targetFile, "wb") as fp: for ch in data: try: fp.write(ch); except Exception, e: tmp = str(e); flag = r"character u'\uf7"; idx = tmp.find(flag); dd = tmp[idx+len(flag) : idx+len(flag)+2]; dd = int(dd, 16) dd = "%c" % dd fp.write(dd); return;def Download(driver, url, targetFile): CallJS = 'return download("' +url+ '");' data = driver.execute_script(FuncionsJS+CallJS); SaveData(data, targetFile); return;if "__main__"==__name__: try: service_args_obj = [ '--proxy=localhost:8080', '--proxy-type=http', "--web-security=false", ] DesiredCapabilities.PHANTOMJS['phantomjs.page.settings.webSecurityEnabled'] = False; driver=webdriver.PhantomJS("phantomjs", desired_capabilities=DesiredCapabilities.PHANTOMJS #,service_args=service_args_obj ); driver.get("http://android.d.cn"); Download(driver, "http://raw.android.d.cn/cdroid_res/web/news20151016/img/logo.png", "logo.png") for entry in driver.get_log('browser'): print " *** LOG", entry pass raw_input("..."); driver.quit() except: print (">>>"+ traceback.format_exc()); pass
这种方法能否下载大文件没有测试!
3. 参考:
【1】http://www.cnblogs.com/kavmors/p/4744445.html
【2】http://docs.casperjs.org/en/latest/faq.html?highlight=download#i-m-having-hard-times-downloading-files-using-download
0 0
- Selenium+PhantomJS 实现非html(pdf、图片、apk等)文件下载
- phantomjs实现html生成pdf
- phantomjs html to PDF
- phantomjs 将html 转换为图片或者pdf
- asp获取html字符串中的文件(图片,pdf,rar等)
- Android实现下载图片,视频,APK功能等功能
- 笔记-Android中打开各种格式的文件(apk、word、excel、ppt、pdf、音视频、图片等)
- Android中打开各种格式的文件(apk、word、excel、ppt、pdf、音视频、图片等)
- 笔记-Android中打开各种格式的文件(apk、word、excel、ppt、pdf、音视频、图片等)
- js实现html下载到本地并生成pdf文件
- 下载文件如word,pdf文件等
- 如何在html中下载pdf等文件而不是直接打开
- java实现pdf文件下载
- java实现pdf文件下载
- 使用phantomjs.exe将网页链接保存成pdf、png等文件
- 利用selenium webdriver下载不同类型的文件(pdf,txt等等)
- 下载图片、文件等代码
- C# web实现word 转Html、office转Html、pdf转图片 在线预览文件
- Android系统默认输入法的修改
- Meteor 路由
- 武汉大学编译原理第五次作业
- 解决在Safari、IE高版本中采用自定义选择文件按钮ajaxFileUpload不能上传问题
- 关于CGRect包含交错,中心,边缘的检测
- Selenium+PhantomJS 实现非html(pdf、图片、apk等)文件下载
- iOS9.0 微信、QQ分享提示未安装
- 架构设计:系统间通信(13)——RPC实例Apache Thrift 下篇(1)
- myeclipse里为什么把所需的jar包拷到web-inf的lib下,java类里就报错了?
- POI操作EXCEL
- MYSQL查询语句大全集锦
- 初学Android项目:开发电子市场<第五天>
- dnspod
- ios关于线程调度的三种方式之NSThread