Экран веб-страницы, которая отображает данные страницы с помощью Mechanize - PullRequest
0 голосов
/ 21 марта 2009

Я пытаюсь отсканировать экран веб-страницы (используя Механизацию), которая отображает записи на сетке. Я могу прочитать значения, отображаемые на первой странице, но теперь мне нужно перейти на следующую страницу, чтобы прочитать соответствующие значения.

<tr>
    <td><span>1</span></td>
    <td><a href="javascript:__doPostBack('gvw_offices','Page$2')">2</a></td>
    <td><a href="javascript:__doPostBack('gvw_offices','Page$3')" >3</a></td>
    <td><a href="javascript:__doPostBack('gvw_offices','Page$4')" >4</a></td>
    <td><a href="javascript:__doPostBack('gvw_offices','Page$5')" >5</a></td>
    <td><a href="javascript:__doPostBack('gvw_offices','Page$6')">6</a></td>
    <td><a href="javascript:__doPostBack('gvw_offices','Page$7')" >7</a></td>
    <td><a href="javascript:__doPostBack('gvw_offices','Page$8')">8</a></td>
    <td><a href="javascript:__doPostBack('gvw_offices','Page$9')" >9</a></td>
    <td><a href="javascript:__doPostBack('gvw_offices','Page$10')" >10</a></td>
    <td><a href="javascript:__doPostBack('gvw_offices','Page$11')">...</a></td>
</tr>

Я могу пройти по всем ссылкам, но когда я пытаюсь это сделать: -

links = (row/"a")
links.each do |link|
    agent.click link.attributes['href']   # This fails 
    agent.click link   # This also fails
end

Причина в том, что agent.click ожидает URL-адрес в качестве аргумента.

Есть ли способ, где мы можем прочитать все значения, когда они отображаются по страницам? Если нет, то как мы можем выполнить такое действие, когда href является обратной передачей, а не URL?

Ответы [ 4 ]

5 голосов
/ 21 марта 2009

Механизация не может обрабатывать JavaScript, поэтому в основном у вас есть два варианта:

  • используйте scrubyt и firewatir: это способ написания скриптов в вашем браузере (поэтому Firefox обрабатывает часть JavaScript)
  • вручную проверьте базовый URL и динамически добавьте номер страницы

что-то вроде:

base_url = 'http://example.com/gvw_offcies&page='
links.each do |link|
  page_number = ... #get the page number from link
  agent.get base_url+page_number
end
1 голос
/ 23 сентября 2010

все решения, описанные выше, которые я пробовал в прошлом в течение длительного периода времени (особенно Celerity), но я пришел к выводу, что все они ужасны и имеют серьезные недостатки, которые делают жизнь очень трудной, поскольку они основаны на одном и том же HtmlUnit движок для обработки Javascript.

Celerity - это не инструмент для очистки экрана, его не хватает в Windows Management, и он основан на движке HTMLUNIT, который совсем не хорош в работе с Javascript. Тем не менее, он работает быстро для сайтов, использующих минимальный или средний уровень запросов Javascript и AJAX. Он основан на рубине, который станет облегчением для тех, кто не любит Java.

Лучше всего использовать Selenium WebDriver API. Это требует отображения X на вашем Linux-сервере, и это медленнее, чем HtmlUnit, но это не доставит вам проблем, связанных с использованием чего-либо производного или переноса HtmlUnit. Существует возможность использовать HtmlUnit, но вы жертвуете точностью, постоянством и скоростью. HtmlUnit намного быстрее для очистки.

Тем не менее, скорость всегда плохая, если вы удаляете другие сайты, которые вам не принадлежат, так как обычно это требует запрета IP.

Мой личный совет: держитесь подальше от всего, что использует движок HtmlUnit, и используйте Selenium, который напрямую управляет браузером по вашему выбору для максимальной точности и надежности.

0 голосов
/ 21 января 2010

Вы можете попробовать использовать Celerity в Jruby и передать страницу в библиотеку HTML-анализа. Предполагается, что Celerity совместим с Watir по API и является оболочкой для HtmlUnit. Я использовал механизировать для сбора данных, но пришлось переключиться на это для нескольких сайтов, которые были созданы в JS.

http://celerity.rubyforge.org/

0 голосов
/ 12 декабря 2009

Я бы использовал что-то вроде webscarab , чтобы просто увидеть, куда на самом деле идут запросы POST, которые выполняет Javascript. Специально для AJAX, в любом случае, это всего лишь HTTP-запросы.
Просто запустите его и установите его в качестве прокси в Firefox. Большую часть времени вы можете увидеть какой-то шаблон и просто очистить эти URL-адреса напрямую

...