Phantomjs抓取渲染JS后的网页(Python代码)


Posted in Python onMay 13, 2016

最近需要爬取某网站,无奈页面都是JS渲染后生成的,普通的爬虫框架搞不定,于是想到用Phantomjs搭一个代理。

Python调用Phantomjs貌似没有现成的第三方库(如果有,请告知小编),漫步了一圈,发现只有pyspider提供了现成的方案。

简单试用了一下,感觉pyspider更像一个为新手打造的爬虫工具,好比一个老妈子,有时无微不至,有时喋喋不休。 轻巧的小工具应该更受人喜爱,我也怀着一点私心,可以带着我最爱的BeautifulSoup一块儿用,而不用再学PyQuery(pyspider用来解析HTML),更不用忍受浏览器写Python的糟糕体验(偷笑)。

所以花了一个下午的时间,把pyspider当中实现Phantomjs代理的部分拆了出来,独立成一个小的爬虫模块,希望大家会喜欢(感谢binux!)。

准备工作

你当然要有Phantomjs,废话!(Linux下最好用supervisord守护,必须保持抓取的时候Phantomjs一直处于开启状态)
用项目路径下的phantomjs_fetcher.js启动:phantomjs phantomjs_fetcher.js [port]
安装tornado依赖(使用了tornado的httpclient模块)

调用是超级简单的

from tornado_fetcher import Fetcher

# 创建一个爬虫
>>> fetcher=Fetcher(
  user_agent='phantomjs', # 模拟浏览器的User-Agent
  phantomjs_proxy='http://localhost:12306', # phantomjs的地址
  poolsize=10, # 最大的httpclient数量
  async=False # 同步还是异步
  )
# 开始连接Phantomjs的代码,可以渲染JS!
>>> fetcher.fetch(url)
# 渲染成功后执行额外的JS脚本(注意用function包起来!)
>>> fetcher.fetch(url, js_script='function(){setTimeout("window.scrollTo(0,100000)}", 1000)')

代码 https://github.com/2shou/PhantomjsFetcher

Python 相关文章推荐
pyqt4教程之messagebox使用示例分享
Mar 07 Python
Python3实现生成随机密码的方法
Aug 23 Python
使用70行Python代码实现一个递归下降解析器的教程
Apr 17 Python
深入理解python中的atexit模块
Mar 07 Python
Python实现的科学计算器功能示例
Aug 04 Python
python导出chrome书签到markdown文件的实例代码
Dec 27 Python
python list是否包含另一个list所有元素的实例
May 04 Python
Python读取mat文件,并保存为pickle格式的方法
Oct 23 Python
Django-xadmin+rule对象级权限的实现方式
Mar 30 Python
Tensorflow中批量读取数据的案列分析及TFRecord文件的打包与读取
Jun 30 Python
OpenCV利用python来实现图像的直方图均衡化
Oct 21 Python
CocosCreator ScrollView优化系列之分帧加载
Apr 14 Python
python基于phantomjs实现导入图片
May 13 #Python
Python中遍历字典过程中更改元素导致异常的解决方法
May 12 #Python
Python安装使用命令行交互模块pexpect的基础教程
May 12 #Python
Python下载指定页面上图片的方法
May 12 #Python
Python基于二分查找实现求整数平方根的方法
May 12 #Python
python二分查找算法的递归实现方法
May 12 #Python
Python数据类型详解(四)字典:dict
May 12 #Python
You might like
全国FM电台频率大全 - 3 河北省
2020/03/11 无线电
php函数array_merge用法一例(合并同类数组)
2013/02/03 PHP
对于ThinkPHP框架早期版本的一个SQL注入漏洞详细分析
2014/07/04 PHP
本地计算机无法启动Apache故障处理
2014/08/08 PHP
php使用post数组的键值创建同名变量并赋值的方法
2015/04/03 PHP
使用Javascript和DOM Interfaces来处理HTML
2006/10/09 Javascript
JavaScript去除空格的三种方法(正则/传参函数/trim)
2013/02/06 Javascript
jquery $.each()使用探讨
2013/09/23 Javascript
JS获取随机数函数可自定义最小值最大值
2014/05/08 Javascript
JavaScript实现在页面间传值的方法
2015/04/07 Javascript
详解js中Json的语法与格式
2016/11/22 Javascript
谈谈JavaScript中浏览器兼容问题的写法小议
2016/12/17 Javascript
jQuery基于正则表达式的表单验证功能示例
2017/01/21 Javascript
js 调用百度分享功能
2017/02/27 Javascript
ES6使用let命令更简单的实现块级作用域实例分析
2017/03/31 Javascript
JavaScript设计模式之代理模式详解
2017/06/09 Javascript
基于vue循环列表时点击跳转页面的方法
2018/08/31 Javascript
JointJS流程图的绘制方法
2018/12/03 Javascript
nuxt框架中对vuex进行模块化设置的实现方法
2019/09/06 Javascript
微信小程序之高德地图多点路线规划过程示例详解
2021/01/18 Javascript
[02:41]DOTA2英雄基础教程 亚巴顿
2014/01/02 DOTA
Python入门篇之文件
2014/10/20 Python
详解Python中的序列化与反序列化的使用
2015/06/30 Python
python字符串str和字节数组相互转化方法
2017/03/18 Python
解决Tensorflow使用pip安装后没有model目录的问题
2018/06/13 Python
python列表插入append(), extend(), insert()用法详解
2019/09/14 Python
python 浮点数四舍五入需要注意的地方
2020/08/18 Python
Django如何使用asyncio协程和ThreadPoolExecutor多线程
2020/10/12 Python
员工拓展培训方案
2014/02/15 职场文书
幼儿园教学工作总结2015
2015/05/12 职场文书
军训阅兵新闻稿
2015/07/17 职场文书
个人合作协议范本
2015/08/06 职场文书
读后感怎么写?书写读后感的基本技巧!
2019/12/10 职场文书
话题作文之学会尊重
2019/12/16 职场文书
关于Numpy之repeat、tile的用法总结
2021/06/02 Python
MongoDB数据库的安装步骤
2021/06/18 MongoDB