Загрузите PhantomJS, используя ссылку javascript
Я пытаюсь очистить веб-сайт ниже:
http://www.fangraphs.com/leaders.aspx?pos=all&stats=bat&lg=all&qual=0&type=8&season=2011&month=0&season1=2011&ind=0&team=0&rost=0&players=0
Если вы нажмете маленькую кнопку в правом верхнем углу таблицы под названием "экспорт данных", запускается javascript script, и мой браузер загружает файл в формате .csv. Я бы хотел написать PhantomJS script, который может сделать это автоматически. Любые идеи?
Вышеупомянутая кнопка закодирована в HTML как таковой:
<a id="LB_cmdCSV" href="javascript:__doPostBack('LB$cmdCSV','')">Export Data</a></div>
Я также нашел эту функцию в исходном коде HTML:
<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
//]]>
</script>
Я очень новичок в PhantomJS/Javascript и могу использовать некоторые указатели здесь. Я думаю, что нашел всю информацию, которая мне нужна, чтобы сделать это автоматически (исправьте меня, если я ошибаюсь), но просто не знаю, с чего начать ее кодирование. Спасибо за любую помощь.
EDIT - вот что выглядит мой script:
var page = new WebPage();
url = 'http://www.fangraphs.com/leaders.aspx?pos=all&stats=bat&lg=all&qual=0&type=8&season=2011&month=0&season1=2011&ind=0&team=0&rost=0& players=0';
page.open(encodeURI(url), function (status){
if (status !== "success") {
console.log("Unable to access website");
} else {
page.evaluate(function() {
__doPostBack('LB$cmdCSV', '');
});
}
phantom.exit(0);
});
Ответы
Ответ 1
Не удалось ли запустить код __doPostBack('LeaderBoard1$cmdCSV','');
в контексте веб-страницы?
Что-то вроде этого:
page.evaluate(function() {
__doPostBack('LeaderBoard1$cmdCSV','');
});
Я не тестировал этот код внутри PhantomJS, но теоретически он должен работать, поскольку работает метод __doPostBack из консоли разработчика Google Chrome. Если вы сомневаетесь в запуске JavaScript-кода в PhantomJS, консоль разработчика Google Chrome - отличный способ проверить код, поскольку он работает на WebKit, таком как PhantomJS. Надеюсь, это поможет.
Ответ 2
Что сработало для меня очень хорошо, это имитировать щелчки мышью на нужном элементе.
page.evaluate(function () {
var btn = document.getElementById('LB_cmdCSV')
var ev = document.createEvent('MouseEvent')
ev.initEvent('click', true, true)
btn.dispatchEvent(ev)
})
Ответ 3
Это веб-сайт, основанный на ASP, поэтому это будет немного сложнее, чем большинство, и вам придется использовать команды cURL, чтобы имитировать POST-версию всей формы viewstate и eventvalidation-строк обратно на сервер. Наверное, просто просто поднимите данные прямо со страницы, которую у вас есть.
Ответ 4
Я использую Ruby on Rails и Watir Webdriver (https://github.com/watir/watir-webdriver).
Я определил, что инструмент, использующий ASP.NET при использовании браузера "doPostBack", используемого User Agent, определенного клиентом. При использовании PhantomJS пользовательский агент идентифицируется как "Mozilla/5.0 (Unknown, Linux i686) AppleWebKit/534.34 (KHTML, например, Gecko) Safari/534.34 PhantomJS/1.9.1".
Поэтому перед доступом к странице необходимо изменить клиент агента пользователя. Rails и сделал что-то вроде:
HTTP_USER_AGENT = "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:22.0) Gecko/20100101 Firefox/22.0"
HTTP_DRIVER = Selenium::WebDriver.for :phantomjs, :desired_capabilities => Selenium::WebDriver::Remote::Capabilities.phantomjs(
"phantomjs.page.settings.userAgent" => HTTP_USER_AGENT
)
...
browser = Watir::Browser.new HTTP_DRIVER, :http_client => client