Скрининг aspx с Python Mechanize - отправка формы Javascript - PullRequest
6 голосов
/ 24 мая 2011

Я пытаюсь очистить данные Британского агентства пищевых рейтингов aspx страницы результатов поиска (например, g http://ratings.food.gov.uk/QuickSearch.aspx?q=po30), используя Mechanize / Python на scraperwiki (http://scraperwiki.com/scrapers/food_standards_agency/) но возникает проблема при попытке перейти по ссылкам «следующей» страницы, которые имеют вид:

<input type="submit" name="ctl00$ContentPlaceHolder1$uxResults$uxNext" value="Next >" id="ctl00_ContentPlaceHolder1_uxResults_uxNext" title="Next >" />

Обработчик формы выглядит так:

<form method="post" action="QuickSearch.aspx?q=po30" onsubmit="javascript:return WebForm_OnSubmit();" onkeypress="javascript:return WebForm_FireDefaultButton(event, 'ctl00_ContentPlaceHolder1_buttonSearch')" id="aspnetForm">
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__LASTFOCUS" id="__LASTFOCUS" value="" />

Трассировка HTTP, когда я вручную нажимаю Следующие ссылки, показывает __EVENTTARGET пустым? На всех шпаргалках, которые я могу найти на других скребках, манипулирование __EVENTTARGET является способом обработки следующих страниц.

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

Итак, есть идеи о том, как очистить страницы результатов 1 + N для N> 0?

Ответы [ 2 ]

8 голосов
/ 25 мая 2011

Механизация не обрабатывает javascript, но для этого конкретного случая она не нужна.

Сначала мы открываем страницу результатов с помощью механизма

url = 'http://ratings.food.gov.uk/QuickSearch.aspx?q=po30'
br = mechanize.Browser()
br.set_handle_robots(False)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
br.open(url)
response = br.response().read()

Затем выбираем форму aspnet:

br.select_form(nr=0) #Select the first (and only) form - it has no name so we reference by number

Форма имеет 5 кнопок отправки - мы хотим отправить ту, которая перенесет нас на следующую страницу результатов:

response = br.submit(name='ctl00$ContentPlaceHolder1$uxResults$uxNext').read()  #"Press" the next submit button

Другие кнопки отправки в форме:

ctl00$uxLanguageSwitch # Switch language to Welsh
ctl00$ContentPlaceHolder1$uxResults$Button1 # Search submit button
ctl00$ContentPlaceHolder1$uxResults$uxFirst # First result page
ctl00$ContentPlaceHolder1$uxResults$uxPrevious # Previous result page
ctl00$ContentPlaceHolder1$uxResults$uxLast # Last result page

В механизме мы можем получить информацию о форме следующим образом:

for form in br.forms():
    print form
2 голосов
/ 25 мая 2011

Механизация не обрабатывает JavaScript.

Однако есть много способов справиться с этим, включая QtWebKit , python-spidermonkey , HtmlUnit (с использованием Jython) или SeleniumRC .

Вот как это можно сделать с SeleniumRC:

import selenium
sel=selenium.selenium("localhost",4444,"*firefox", "http://ratings.food.gov.uk")   
sel.start()
sel.open("QuickSearch.aspx?q=po30")
sel.click('ctl00$ContentPlaceHolder1$uxResults$uxNext')

См. Также эти связанные вопросы SO:

  1. Как перейти по ссылке, которая имеет JavaScript
  2. Нажмите на ссылку JavaScript внутри Python
...