Загрузка PhantomJS с использованием ссылки на JavaScript - PullRequest
13 голосов
/ 19 января 2012

Я пытаюсь очистить веб-сайт, указанный ниже:

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, и мой браузер загрузит файл в форме .csv. Я хотел бы иметь возможность написать скрипт PhantomJS, который может сделать это автоматически. Есть идеи?

Вышеуказанная кнопка закодирована в 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 и могу использовать некоторые указатели здесь. Я думаю, что нашел всю информацию, которая мне нужна, чтобы сделать это автоматически (поправьте меня, если я ошибаюсь), но просто не уверен, с чего начать при ее кодировании. Спасибо за любую помощь.

РЕДАКТИРОВАТЬ - Вот как выглядит мой скрипт прямо сейчас:

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);
});

Ответы [ 4 ]

1 голос
/ 18 июня 2015

Что мне очень помогло, так это симуляция щелчков мышью по нужному элементу.

page.evaluate(function () {
  var btn = document.getElementById('LB_cmdCSV')
  var ev = document.createEvent('MouseEvent')
  ev.initEvent('click', true, true)
  btn.dispatchEvent(ev)
})
0 голосов
/ 06 февраля 2012

Это веб-сайт на базе ASP, так что это будет немного сложнее, чем у большинства, и вам придется использовать команды cURL, чтобы имитировать POST-передачу всей строки viewstate & eventvalidation формы обратно на сервер. Наверное, просто будет проще поднять данные прямо со страницы, которую вы имеете.

0 голосов
/ 03 июля 2013

Я использую Ruby on Rails и Watir Webdriver (https://github.com/watir/watir-webdriver).

. Я обнаружил, что инструмент, использующий ASP.NET при использовании идентичного браузера «doPostBack», используется агентом пользователя, определяемымклиент. При использовании 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
0 голосов
/ 27 января 2012

Не могли бы вы просто запустить код, __doPostBack('LeaderBoard1$cmdCSV','');, в контексте веб-страницы?

Примерно так:

page.evaluate(function() {
  __doPostBack('LeaderBoard1$cmdCSV','');
});

Я не тестировал этот код вPhantomJS, но теоретически он должен работать, поскольку работает метод __doPostBack из консоли разработчика Google Chrome.Если у вас есть сомнения по поводу запуска кода JavaScript в PhantomJS, консоль разработчика Google Chrome - отличный способ протестировать код, поскольку он работает в WebKit, таком как PhantomJS.Надеюсь, это поможет.

...