利用phantomjs+selenium抓取js执行后的结果

0x01 问题需求
有需要写一个接口需要可以抓取360webscan的网站评分及漏洞情况,本来以为一个简单的爬虫就能搞定的。哪想到把网页抓下来后一下子就懵逼了,先看获取分数的地方

1
2
3
4
5
6
7
8
9
10
11
$.ajax({  	

url : "/webscore/index",

type: 'POST',

dataType: 'json',

data:'isxujia='+isxujia+'&iscuangai='+iscuangai+'&isviolation='+isviolation+'&isguama='+isguama+'&high='+high+'&mid='+mid+'&low='+low+'&info='+info+'&domain=www.natco.top&pangzhu='+pangzhu,

success: function(data){

先看这一段ajax请求,把url的参数连同isxujia(是否虚假)等参数向服务器请求后,获取得分。那么isxujia等参数从哪里来?再往上看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$.ajax({

url: "/index/gettrojan",

type:"POST",

dataType:"json",

data:"url="+url+"&token=34e08ea449361738107148de883678c4&time=1462934864",

success: function(data){

var type = "";

var st = "";

var sc = "";

var ssc = "";

var trojan_list = "";

var isxujia = 0;

简单的看了下,就是这个ajax请求(带token)返回的type,st等参数经过一些条件判断,计算isxujia是否为1。由于有token,这个地方就没办法自己在python里将计算过程复现了。剩下的路就是要抓取js渲染过后的页面值了,网上最成熟的方法就是phantomjs+selenium。


0x02 环境配置
Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE、Mozilla Firefox、Chrome等。
Phantom JS是一个服务器端的 JavaScript API 的 WebKit。其支持各种Web标准: DOM 处理, CSS 选择器, JSON, Canvas, 和 SVG。
在kali2.0环境下,先安装Selenium: sudo apt-get install selenium
再安装Phantom JS,官方网站下载页面:传送门,根据自己的系统版本下载,并配置

1
2
3
4
5
6
cd /usr/local/share
sudo wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
sudo tar -xvf phantomjs-2.1.1-linux-x86_64.tar.bz2
sudo ln -s /usr/local/share/phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/share/phantomjs
sudo ln -s /usr/local/share/phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin/phantomjs
sudo ln -s /usr/local/share/phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/bin/phantomjs

0x03 demo
这里phantomjs的可执行路径为’/usr/bin/phantomjs’,下面是个小的demo

1
2
3
4
5
6
7
8
9
#coding=utf-8
from selenium import webdriver

driver = webdriver.PhantomJS(executable_path='/usr/bin/phantomjs') #注意这里的执行路径
driver.get("http://phperz.com/")
driver.find_element_by_id('search_form_input_homepage').send_keys('Nirvana')
driver.find_element_by_id("search_button_homepage").click()
print driver.current_url
driver.quit() #注意要退出

主要是通过selenium获取js渲染后的dom节点的值。

参考链接:
http://ohroot.com/2014/11/11/phantomjs%E5%B0%8F%E8%AF%95%E7%89%9B%E5%88%80/