Pregunta

Estoy escribiendo un script de raspador de pantalla en python con el módulo 'mecanizar' y me gustaría usar el método mechanize.click_link () en un enlace que tiene javascript: __ doPostBack en href. Creo que la página que intento analizar está usando AJAX.

Nota: mech es el mechanize.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

Me gustaría recuperar la fuente de la página después de hacer clic en el enlace.

¿Fue útil?

Solución

No uso mecanizar, pero hago mucho web scraping con python.

Cuando me encuentro con una función de JavaScript como __doPostBack, hago lo siguiente:
Accedo al sitio web en Firefox y uso la extensión HttpFox para ver los parámetros de la POST solicita el navegador enviado al servidor web al hacer clic en el enlace correspondiente.
Luego construyo la misma solicitud en python usando urllib.parse.urlencode para construir las cadenas de consulta y los datos POST que necesito.
A veces, el sitio web también usa cookies, así que solo uso el http.cookiejar de Python.

He usado esta técnica con éxito varias veces.

Otros consejos

No creo que mecanizar sea compatible con Javascript; para raspar páginas que dependen intrínsecamente de la ejecución de Javascript para su funcionalidad, es posible que necesite usar una herramienta diferente, como 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top