2015-11-05 52 views
1

我一直試圖弄清楚這一點,但現在還沒有能夠實現它。在PhantomJS中動態更改鏈接並單擊它以刮掉頁面

有這個網頁是我需要取消所有可用的記錄,我注意到,如果我修改分頁鏈接與螢火蟲或瀏覽器的檢查員,我可以得到我需要的所有記錄,例如,這是原文鏈接:

<a href="javascript:gReport.navigate.paginate('paginator_min_row=16max_rows=15rows_fetched=15')"> 

如果我修改鏈接這樣

<a href="javascript:gReport.navigate.paginate('paginator_min_row=1max_rows=5000rows_fetched=5000')"> 

,然後點擊分頁按鈕的瀏覽器(同樣的,它包含我只是改變了鏈接)我能夠從該網站獲取我需要的所有記錄(大部分時間「r ows「沒有得到任何大於4000,我使用5000以防萬一)

因爲我必須每天手工處理該文件,所以我認爲我可以使用PhantomJS自動化進程並獲取整個頁面在沒有尋找一個鏈接,然後以修改分頁鏈接進行更改,所以並獲得所有記錄,我用下面的代碼跑單:

var page = require('webpage').create(); 
var fs = require('fs'); 
page.open('http://testingsite1.local', function() { 
    page.evaluate(function(){ 
     $('a[href="javascript:gReport.navigate.paginate(\'paginator_min_row=16max_rows=15rows_fetched=15\')"]').first().attr('href', 'javascript:gReport.navigate.paginate(\'paginator_min_row=1max_rows=5000rows_fetched=5000\')').attr('id','clickit'); 
    $('#clickit')[0].click(); 
    }); 

    page.render('test.png'); 
    fs.write('test.html', page.content, 'w'); 
    phantom.exit(); 
}); 

注意,有一些網站在兩個分頁鏈接,因爲我使用jQuery的「.first()」只選擇第一個。

此外,由於所需的鏈接沒有任何標識符,我選擇它使用自己的鏈接,然後將其更改爲我所需要的,最後我添加「clickit」ID以便稍後調用。

現在,這是我的問題:

我,不知道是什麼原因它不工作,如果我運行的代碼只取第一頁,檢查請求的頁面源代碼,我做的後看到HREF鏈接已改爲我想要的東西,但它只是不會被調用,我有什麼可能是錯誤

  1. 修改後的HREF沒有得到兩種不同的理論,「點擊」所以頁面沒有得到更新

  2. 該href確實得到點擊,但由於該頁面需要幾秒鐘的加載所有結果動態我只得到帥位的第一頁Phantomjs得到看到

你們認爲怎麼樣呢?


[最新消息2015年11月6日] 好了,通過@Artjomb和@pguardiario提供的答案我指出一個新的方向:

  1. 我需要更多的調試上的信息是怎麼回事在
  2. 我需要調用gReport.navigate。分頁功能直接

可悲的是我只是缺乏經驗正確使用PhantomJS,其他幾個樣品等方式表明的是我能做到什麼,我想與CasperJS,所以我試了一下,這是我在幾個小時後產生

var utils = require('utils'); 
var fs = require('fs'); 
var url = 'http://testingsite1.local'; 

var casper = require('casper').create({ 
    verbose: true, 
    logLevel: 'debug' 
}); 

casper.on('error', function(msg, backtrace) { 
    this.echo("========================="); 
    this.echo("ERROR:"); 
    this.echo(msg); 
    this.echo(backtrace); 
    this.echo("========================="); 
}); 

casper.on("page.error", function(msg, backtrace) { 
    this.echo("========================="); 
    this.echo("PAGE.ERROR:"); 
    this.echo(msg); 
    this.echo(backtrace); 
    this.echo("========================="); 
}); 

casper.start(url, function() { 
    var url = this.evaluate(function() { 
    $('a[href="javascript:gReport.navigate.paginate(\'paginator_min_row=16max_rows=15rows_fetched=15\')"]').attr('href', 'javascript:gReport.navigate.paginate(\'paginator_min_row=1max_rows=5000rows_fetched=5000\')').attr('id', 'clicklink'); 
    return gReport.navigate.paginate('paginator_min_row=1max_rows=5000rows_fetched=5000'); 
    }); 
}); 

casper.then(function() { 
    this.waitForSelector('.nonexistant', function() { 
    // Nothing here 
    }, function() { 
    //page load failed after 5 seconds 
    this.capture('screen.png'); 
    var html = this.getPageContent(); 
    var f = fs.open('test.html', 'w'); 
    f.write(html); 
    f.close(); 
    }, 50000); 
}); 

casper.run(function() { 
    this.exit(); 
}); 

請溫柔,因爲我知道這個代碼太爛了,我沒有使用Javascript專家,其實我知道很少的,我知道我應該等待出現的元素,但它根本沒有工作在我的測試中,因爲我仍然沒有從AJAX請求中更新頁面。

最後,我等待着AJAX請求顯示頁面上,然後傾倒HTML

哦,很長一段時間(50秒)的!並直接調用該函數確實很好!

+0

直接執行gReport.navigate.paginate('paginator_min_row = 1max_rows = 5000rows_fetched = 5000')是否更有意義? – pguardiario

+0

@pguardiario這真是個好主意!事實上,你已經指出了我的一個新方向:目前,我在頂部添加了** CasperJS **,並且我正在經歷某種程度的成功,我將用它更新主要問題 – dvisor

回答

0
  • 在href確實獲得點擊,但由於頁面花費幾秒鐘的動態加載所有結果我只得到帥位的第一頁Phantomjs得到看到
  • 可以很容易地檢查它是否是由包裝渲染,寫和退出調用setTimeout和嘗試不同的超時:

    page.open('http://testingsite1.local', function() { 
        page.evaluate(function(){ 
         $('a[href="javascript:gReport.navigate.paginate(\'paginator_min_row=16max_rows=15rows_fetched=15\')"]').first().attr('href', 'javascript:gReport.navigate.paginate(\'paginator_min_row=1max_rows=5000rows_fetched=5000\')').attr('id','clickit'); 
         $('#clickit')[0].click(); 
        }); 
    
        setTimeout(function(){ 
         page.render('test.png'); 
         fs.write('test.html', page.content, 'w'); 
         phantom.exit(); 
        }, 5000); 
    }); 
    

    如果它真的只是一個時間那麼你應該使用waitFor() function來等待一個特定的條件,比如「加載所有元素」或「加載該類型的x個元素」。

    1. 修改後的href是沒有得到「點擊」所以頁面是沒有得到更新

    這是一個有點棘手。您可以收聽onConsoleMessage,onError,onResourceError,onResourceTimeout事件(Example)並查看頁面上是否有錯誤。其中一些錯誤可以通過您在PhantomJS中可以完成的工作來解決:Function.prototype.bind not availableHTTPS site/resources cannot be loaded

    還有其他方法可以點擊更可靠的方法,如this one