盒子
盒子
文章目录
  1. 0x01起源
  2. 安装phantomjs
  3. phantomjs实现网页截图
  4. phantomjs实现页面爬虫

phantomjs小试牛刀

这几天在做批量网站获取whois信息方面的东西,发现了whois信息格式不是统一的,也尝试了很多方法,后来发现万网的数据格式挺不错的,于是就把我引向了phantomjs的学习。

0x01起源

问题首先是这样的,万网whois查询页面是通过ajax的方式获取whois信息的,传统的urllib等方法爬虫完全不行。于是就开始小研究了下,看到了phantomjs可以配合selenium实现页面信息的爬取,听师兄介绍说Ghost.py也可以实现类似的功能,但是看到phantomjs还具有网页截图的功能,之前自己一直在研究批量网站的截图,又没找到非常棒的解决方案。看别人评价说速度还不错,于是果断决定学习下

安装phantomjs

这里只写出ubuntu下面的无脑操作方法,其他环境参考官方教程

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

测试是否安装成功phantomjs -v

phantomjs实现网页截图

下面是其官方给的简单实现

1
2
3
4
5
var page = require('webpage').create();
page.open('http://www.baidu.com/', function() {
page.render('baidu.png');
phantom.exit();
});

测试方法:将上述代码另存为cap.js文件,在命令行下执行phantomjs ./cap.js即可在当前目录生成百度的首页截图,命名为baidu.jpg

下面是一个更加友好的实现方式,可以自定义图片生成路径和图片的像素
使用方法phantomjs cap.js http://www.baidu.com ./baidu.jpg 1024*768
还可以生成PDF phantomjs cap.js http://www.baidu.com ./baidu.pdf 1024*768
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
var page = require('webpage').create(),
address, output, size;

if (phantom.args.length < 2 || phantom.args.length > 3) {
console.log('Usage: rasterize.js URL filename [paperwidth*paperheight|paperformat]');
console.log(' paper (pdf output) examples: "5in*7.5in", "10cm*20cm", "A4", "Letter"');
phantom.exit();
} else {
address = phantom.args[0];
output = phantom.args[1];
page.viewportSize = { width: 600, height: 600 };
if (phantom.args.length === 3 && phantom.args[1].substr(-4) === ".pdf") {
size = phantom.args[2].split('*');
page.paperSize = size.length === 2 ? { width: size[0], height: size[1], border: '0px' }
: { format: phantom.args[2], orientation: 'portrait', border: '1cm' };
}
page.open(address, function (status) {
if (status !== 'success') {
console.log('Unable to load the address!');
} else {
window.setTimeout(function () {
page.render(output);
phantom.exit();
}, 200);
}
});
}

写成python版本什么的就直接写个脚本在命令行下调用phantomjs生成图片就好了,由于速度差强人意,就没去写,可能是我姿势不对把

phantomjs实现页面爬虫

这里还是以万网whois查询为例,直接给出源代码,不啰嗦

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/python
#coding: utf-8
from selenium import webdriver

driver = webdriver.PhantomJS(executable_path='/usr/bin/phantomjs') #这里指定phatomjs可执行文件的位置
driver.get("http://whois.www.net.cn/whois/domain/baidu.com")
#print driver.page_source
#print dir(driver)
regOrg = driver.find_element_by_id('info_registrantOrganization').text
print regOrg
regEmail = driver.find_element_by_id('info_registrantEmail').text
print regEmail
regSpon = driver.find_element_by_css_selector('tbody tr:nth-child(7) td:last-child').text
print regSpon
regFromTime = driver.find_element_by_css_selector('tbody tr:nth-child(10) td:last-child').text
print regFromTime
regToTime = driver.find_element_by_css_selector('tbody tr:nth-child(13) td:last-child').text
print regToTime
regNameServer = driver.find_element_by_css_selector('tbody tr:nth-child(19) td:last-child').text
print regNameServer
infowhoisfull = driver.find_element_by_id('info_whois_full').text
print infowhoisfull
driver.quit

写了半天的程序,万网竟然不给批量爬,气死了我。。。抑郁而终!