2009-03-21 4 views
0

Я пытаюсь выполнить скринирование веб-страницы (используя 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 в качестве аргумента.

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

ответ

5

Mechanize не может справиться с JavaScript, поэтому в основном у вас есть два варианта:

  • использование scrubyt и firewatir: это способ сценария вашего браузера (так Firefox обрабатывает яваскрипта часть)
  • вручную проверить базовый 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 
+0

Это хорошее решение! – Geo

+0

Проблема в том, что эта страница использует ASP.Grid для отображения страницы с данными, поэтому ссылка для каждой страницы нет, это сообщение и не имеет прямого URL-адреса. Вы говорите, что если мы добавим имя сетки и номер страницы в URL-адрес, мы можем вызвать эту обратную передачу (хотя это не сработало, когда я попробовал)? – MOZILLA

+0

Я не знаком с ASP.net, но пост назад - это в основном запрос POST на текущую страницу, не так ли? поэтому вы можете попробовать что-то вроде agent.post current_url, {"page_number" => page_number} –

0

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

0

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

http://celerity.rubyforge.org/

1

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

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

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

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

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