2011-05-24 15 views
6

Sto cercando di raschiare i dati del Regno Unito Valutazioni Food Agency aspx pagine dei risultati delle paroli di ricerca utilizzando Mechanize/Python su scraperwiki (http://scraperwiki.com/scrapers/food_standards_agency/), ma fino a venire con un (e, g http://ratings.food.gov.uk/QuickSearch.aspx?q=po30.) problema quando si cerca di seguire "prossimi" link della pagina che hanno la forma:Screenscaping aspx con Python Mechanize - Javascript modulo di presentazione

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

il gestore del modulo si presenta come:

<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="" /> 

Una traccia HTTP quando clicco manualmente i collegamenti prossimi concerti __E VENTTARGET come vuoto? Tutti i presepi che posso trovare su altri scrapers mostrano la manipolazione di __EVENTTARGET come modo di gestire le pagine successive.

In effetti, non sono sicuro di come la pagina che voglio rasentare carichi la pagina successiva? Qualunque cosa io lanci al raschietto, riesce sempre a caricare la prima pagina dei risultati. (Anche essere in grado di cambiare il numero di risultati per pagina sarebbe utile, ma non riesco a vedere come farlo!)

Quindi - qualsiasi idea su come raschiare le pagine dei risultati 1 + N'th per N> 0?

risposta

8

Mechanize Indifferente gestire javascript, ma per questo caso particolare non è t necessario.

Per prima cosa aprire la pagina dei risultati con mechanize

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() 

Poi selezionare la forma aspnet:

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

La forma è 5 bottoni di invio - vogliamo presentare quello che ci porta a la pagina seguente risultato:

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

Gli altri pulsanti di invio nel modulo sono:

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 

In mechanize possiamo ottenere informazioni modulo come questo:

for form in br.forms(): 
    print form 
2

Mechanize non gestisce JavaScript.

Ci sono molti modi per gestire questo, tuttavia, tra cui QtWebKit, python-spidermonkey, HtmlUnit (utilizzando Jython) o SeleniumRC.

Ecco come potrebbe essere fatto con 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') 

Vedi anche questi correlate, al fine domande:

  1. How to click a link that has JavaScript
  2. Click on a JavaScript link within Python
Problemi correlati