Подтвердить что ты не робот

Загрузите 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);
});
4b9b3361

Ответ 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