pythonベースPhantomjsネットワークモニタリング

4894 ワード

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("
"); 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
'; 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))