基于python的Phantomjs网络监测

Phantomjs对于广大爬虫工程是来说,绝对是一大利器,本人作为一名爬虫初学者,在此分享一些使用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))

你可能感兴趣的:(爬虫)