Phantomjs对于广大爬虫工程是来说,绝对是一大利器,本人作为一名爬虫初学者,在此分享一些使用Phantomjs进行网络监测的心得
公司要求我抓取数十万家公司网站的后台加载数据,判断其是否与第三方进行了合作,完成了数据交互。
接到这个需求我是一脸懵逼的,因为之前抓取数据都是网页数据或则json等等,做这样的事情还是第一次,不过没办法,还是要硬着头皮去做,经过大量的查阅资料才发现phantomjs还有这样的功能,看来以前我是小看它了。
由于phantomjs进行网络监测使用的是js代码,作为一个初级小白,只能使用一些笨方法来做,命令行启动phantomjs抓取是通过命令phantomjs + 文件名的方式实现的,我便通过python程序调用os模块输入命令,让phantomjs去抓取页面并写入文件保存
由于网络监测执行后是不能自动退出的,因为网站加载数据都会与服务器不定时进行数据交互,所以需要给他设定一个超时时间,到了一定时间就不再进行监测了
这个过程中,由于对phantomjs语法不熟悉,花费了大量时间,原本想要通过settimeout进行延时,可是却并没有起作用,可我却找不到原因,只能作罢。
在此贴出代码,希望有人看待能够帮忙修改指正优化,感激不尽。
phantomjs代码
// 主文件
var system = require('system');
if (system.args.length === 1) {
console.log('Try to pass some args when invoking this script!');
} else {
// system.args.forEach(function (arg, i) {
// console.log(i + ': ' + arg);
// });
console.log(system.args[1]);
console.log(system.args[2]);
console.log(system.args[3]);
var filename = system.args[1]
var outfilename = system.args[2]
var gangfa = system.args[3]
}
// phantom.exit();
var fs = require('fs');
var content = fs.read(filename);
// var content = fs.read('te.txt');
// console.log(phantom.args.slice(3))
// var content = fs.read();
console.log('read data:', content);
list = content.split("\n");
console.log('list', list[0], list.length);
for (var i in list) {
// console.log(i);
interval = setTimeout(
function () {
var a = list[i];
info_list = list[i].split(",");
var com_name = info_list[0];
var url = gangfa + info_list[1];
// console.log(i + com_name + url);
// var url = 'http://www.ibabycenter.com/';
var page = require('webpage').create();
page.onResourceRequested = function (request) {
var a = JSON.stringify(request, undefined, 4);
var obj = JSON.parse(a);
var fs = require('fs');
var path = './outdata/' + outfilename;
var content = 'Request,' + com_name + ',' + url + ',' + JSON.stringify(obj.url) + '\r\n';
console.log(content);
fs.write(path, content, 'a');
};
page.open(url);
}()
, 10000);
}
python控制代码
import os
import time
import psutil
import threading
def time_limited(timer):
'''
一个规定函数执行时间的装饰器
:param timer:
:return:
'''
def wrapper(func):
def __wrapper(params):
start_time = time.time()
#通过设置守护线程强制规定函数的运行时间
t = threading.Thread(target=func, args=params)
t.setDaemon(True)
t.start()
time.sleep(timer)
if t.is_alive():
# t._stop()
#若在规定的运行时间未结束守护进程,则主动抛出异常
raise Exception('Function execution timeout')
#print time.time()-start_time
return __wrapper
return wrapper
@time_limited(240)
def aa(i):
# for i in range(1, 2):
filename = './data/' + i + '.txt'
outfilename = 'out_' + i + '.txt'
fangfa1 = "http://"
fangfa2 = "https://"
a = os.system('phantomjs go_http.js ' + filename + ' ' + outfilename + ' ' + fangfa1)
@time_limited(240)
def aa2(i):
# for i in range(1, 2):
filename = './data/' + i + '.txt'
outfilename = 'out_' + i + '.txt'
fangfa1 = "http://"
fangfa2 = "https://"
a = os.system('phantomjs go_http.js ' + filename + ' ' + outfilename + ' ' + fangfa2)
# print(11)
for i in range(6, 10):
try:
print('go')
# bb = str(i)
aa(str(i))
except:
for proc in psutil.process_iter():
if proc.name() == 'phantomjs':
print(2222222222)
os.system('kill ' + str(proc.pid))
try:
print('go')
aa2(str(i))
except:
for proc in psutil.process_iter():
# print(type(proc))
# print("pid-%d,name:%s" % (proc.pid, proc.name()))
if proc.name() == 'phantomjs':
print(2222222222)
os.system('kill ' + str(proc.pid))
with open('jindu.txt', 'a') as fff:
fff.write(str(i))