2017-01-15 9 views
0

Я использую PhantomJS + wget, чтобы увидеть содержимое страницы (это моя цель) на странице javascript.PhantomJS не работает на странице javascript

Это команда я использую:

$ phantomjs save_page.js http://wzdig.pbc.gov.cn:8080/dig/ui/advsearch.action > page.html 

неоспоримым save_page.js

var system = require('system'); 
var page = require('webpage').create(); 

page.open(system.args[1], function() 
{ 
    console.log(page.content); 
    phantom.exit(); 
}); 

Но HTML-шоу "请 开启 JavaScript 并 刷新 该页", что означает "активировать JavaScript".

Что я делаю неправильно?

Спасибо.

+0

вместо example.com вам необходимо указать реальный адрес –

+2

извините, что я скопировал пример. Все еще не работает с фактической страницей. – Zaico

+1

Почему вы упоминаете wget, если он не используется (по крайней мере здесь) – Vaviloff

ответ

1

См обновление ниже линии.

Причина, по которой ваш пример не срабатывает, - это сложная целевая страница, которая проверяет, открывается ли страница в реальном браузере, который может выполнять javscript. При первой загрузке страницы вашему браузеру предоставляется javascript для выполнения. Затем во второй раз, когда страница загружается, отображается реальная страница.

Но в вашем примере скрипт выходит сразу после загрузки первой страницы.

Немного лучшее решение, которое не полагается на тайм-аут 3 секунд (подключение к китайским сайтам часто происходит медленно, мы не можем быть на 100% уверены, что достаточно 3 секунд).

var system = require('system'); 
var page = require('webpage').create(); 

var system = require('system'); 
var page = require('webpage').create(); 

// Imitate a real browser 
page.viewportSize = { width: 1440, height: 900 }; 
page.settings.userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36"; 

// Called every time a page is loaded 
page.onLoadFinished = function(){ 

    // If the real page with search controls is loaded 
    // then get page.content and exit 
    var inputCount = page.evaluate(function(){ 
     return document.querySelectorAll(".jfk-textinput").length; 
    }); 

    if(inputCount > 0) { 
     console.log(page.content); 
     phantom.exit(); 
    } 

}; 

page.open(system.args[1]); 

UPDATE

Итак, вы, вероятно, после того, как результаты поиска. В этом случае вы можете изменить логику, которая решает, что страница загружается на это решение:

var inputCount = page.evaluate(function(){ 
    return document.querySelectorAll("h3").length; 
}); 

... потому, что заголовки статей, найденных выводятся с <h3> бирок.

+0

'gov.cn', это сайт правительства! Я считаю, 3s задержки будет достаточно, но ваш код тоже хорош! –

+1

@Igor Вы, вероятно, правы, но мне нравится представлять, что этот образец может быть использован в другой ситуации в будущем, поэтому я стараюсь сделать его более долговечным. Ваше решение также хорошо, потому что оно короче и прямо к сути вопроса. Кстати, спасибо за щедрость, приятель! – Vaviloff

+0

благодаря вам и @Igor. Но я пытаюсь изменить код для определенного поиска, и он не работает. Я предполагаю, что мне придется изменить код в: 'return document.querySelectorAll (". Jfk-textinput "). Length;' например, с помощью поиска. Но он застревает, поэтому я предполагаю, что это не правильный код. Это поиск: [http://wzdig.pbc.gov.cn:8080/dig/ui/search.action?hl=zh-CN&sr=score+desc&q=%E9%93%81&rp=&advepq=%E9% 93% 81 & advoq = & adveq = & ext = & advtime = 2 & advrange = text% 26title] Я попытался изменить «.jfk-textinput» со значением = «铁» без успеха. – Zaico

2

Вам нужно установить userAgent, этот скрипт работает:

var page = require('webpage').create({viewportSize:{width: 1600,height: 900}, 
settings:{userAgent:'Mozilla/5.0 (X11; Linux x86_64; rv:49.0) Gecko/20100101 Firefox/49.0', 
javascriptEnabled:'true', 
loadImages:'false' 
}}); 
var system = require('system'); 

page.open(system.args[1], function(){ 
setTimeout(function(){ 
    console.log(page.content); 
    phantom.exit(); 
},3000); 
}); 
Смежные вопросы