Domanda

Sto scrivendo uno script di screen scraper in python con il modulo 'meccanize' e vorrei usare il metodo mechanize.click_link () su un link che ha javascript: __ doPostBack in href. Credo che la pagina che sto cercando di analizzare stia utilizzando AJAX.

Nota: mech è il meccanizzare.Browser ()

>>> next_link.__class__.__name__
'Link'
>>> next_link
Link(base_url='http://www.citius.mj.pt/Portal/consultas/ConsultasDistribuicao.aspx', url="javascript:__doPostBack('ctl00$ContentPlaceHolder1$Pager1$lnkNext','')", text='2', tag='a', attrs=[('id', 'ctl00_ContentPlaceHolder1_Pager1_lnkNext'), ('title', 'P\xc3\xa1gina seguinte: 2'), ('href', "javascript:__doPostBack('ctl00$ContentPlaceHolder1$Pager1$lnkNext','')")])
>>> req = mech.click_link(next_link)
>>> req
<urllib2.Request instance at 0x025BEE40>
>>> req.has_data()
False

Vorrei recuperare l'origine della pagina dopo aver fatto clic sul collegamento.

È stato utile?

Soluzione

Non uso meccanize, ma faccio un sacco di web raschiando me stesso con Python.

Quando mi imbatto in una funzione javascript come __doPostBack, faccio quanto segue:
Accedo al sito Web in Firefox e utilizzo l'estensione HttpFox per visualizzare i parametri dell'estensione POST richiede il browser inviato al server Web quando si fa clic sul collegamento pertinente.
Quindi creo la stessa richiesta in Python utilizzando urllib.parse.urlencode per creare le stringhe di query e i dati POST di cui ho bisogno.
A volte anche il sito Web utilizza i cookie, quindi utilizzo semplicemente http.cookiejar di python.

Ho usato questa tecnica con successo diverse volte.

Altri suggerimenti

Non credo che meccanize supporti Javascript; per eliminare pagine che si basano intrinsecamente sull'esecuzione di Javascript per la loro funzionalità, potrebbe essere necessario utilizzare uno strumento diverso, ad esempio Selenium RC .

>>> next_link.__class__.__name__
'Link'
>>> next_link
Link(base_url='http://www.citius.mj.pt/Portal/consultas/ConsultasDistribuicao.aspx', url="javascript:__doPostBack('ctl00$ContentPlaceHolder1$Pager1$lnkNext','')", text='2', tag='a', attrs=[('id', 'ctl00_ContentPlaceHolder1_Pager1_lnkNext'), ('title', 'P\xc3\xa1gina seguinte: 2'), ('href', "javascript:__doPostBack('ctl00$ContentPlaceHolder1$Pager1$lnkNext','')")])
>>> req = mech.click_link(next_link)
>>> req
<urllib2.Request instance at 0x025BEE40>
>>> req.has_data()
False
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top