Веб-страница очистки экрана, которая отображает страницу данных с помощью Mechanize

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

<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-адресом??


person MOZILLA    schedule 21.03.2009    source источник


Ответы (4)


Mechanize не может обрабатывать 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
person Gaetan Dubar    schedule 21.03.2009
comment
Проблема в том, что эта страница использует ASP.Grid для отображения записей по страницам, поэтому ссылка для каждой страницы не является обратным сообщением и не имеет прямого URL-адреса. Вы говорите, что если мы добавим имя сетки и номер страницы в URL-адрес, мы можем вызвать эту обратную передачу (хотя это не сработало, когда я пробовал)? - person MOZILLA; 23.03.2009
comment
Я не знаком с ASP.net, но обратная почта — это, по сути, запрос POST на текущую страницу, не так ли? поэтому вы можете попробовать что-то вроде agent.post current_url, {page_number =› page_number} - person Gaetan Dubar; 23.03.2009

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

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

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

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

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

person KJW    schedule 23.09.2010

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

person Marc Seeger    schedule 12.12.2009

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

http://celerity.rubyforge.org/

person tsmith    schedule 20.01.2010