example python python-2.7 web-scraping screen-scraping urllib2

example - selenium python install



¿Alternativas al Selenium/Webdriver para rellenar campos al raspar sin cabeza con Python? (2)

Con Python 2.7 estoy raspando con urllib2 y cuando se necesita algo de Xpath, lxml también. Es rápido , y como rara vez tengo que navegar por los sitios, esta combinación funciona bien. Sin embargo, en ocasiones, cuando llego a una página que solo muestra algunos datos valiosos cuando se completa un formulario corto y se hace clic en un botón de enviar ( ejemplo ), el método de solo raspado con urllib2 no es suficiente.

Cada vez que se encontraba una página de ese tipo, podía invocar a selenium.webdriver para volver a buscar la página y rellenar y hacer clic en el formulario, pero esto disminuirá considerablemente las cosas.

NOTA: Esta pregunta no se trata de los méritos o limitaciones de urllib2 , de lo cual sé que ha habido muchas discusiones. En cambio, se enfoca solo en encontrar un enfoque rápido y sin cabeza para llenar formularios, etc. (uno que también permitirá consultas XPath si es necesario).


Además de los mencionados por alecxe , otra alternativa es usar una herramienta de navegador GUI como la consola web de Firefox para inspeccionar el POST que se realiza al hacer clic en el botón Enviar. A veces puede encontrar los datos POST y simplemente falsificarlos. Por ejemplo, usando el URL de ejemplo que publicó, si

  • Use Firefox para ir a http://apply.ovoenergycareers.co.uk/vacancies/#results
  • Haga clic en Herramientas> Desarrollador web> Consola web
  • Haga clic en Net> Log Request and Response Bodies
  • Rellene el formulario, haga clic en Buscar
  • Haga clic con el botón izquierdo en la (primera) POST en la consola web
  • Haga clic con el botón derecho en la (primera) POST, seleccione COPY POST Data
  • Pegue los datos POST en un editor de texto

obtendrás algo como

all field_36[]=73 field_37[]=76 field_32[]=82 submit=Search

(Tenga en cuenta que los menús de la Consola Web varían un poco según su versión de Firefox, entonces YMMV.) Luego puede falsificar el POST usando código como:

import urllib2 import urllib import lxml.html as LH url = "http://apply.ovoenergycareers.co.uk/vacancies/#results" params = urllib.urlencode([(''field_36[]'', 73), (''field_37[]'', 76), (''field_32[]'', 82)]) response = urllib2.urlopen(url, params) content = response.read() root = LH.fromstring(content) print(''/n''.join([tag.text_content() for tag in root.xpath(''//dl'')]))

cuyos rendimientos

Regulatory Data Analyst Contract Type Permanent Contract Hours Full-time Location Bristol Department Business Intelligence Full description

Si inspecciona el HTML y busca field_36[] encontrará

<div class="multiwrapper"> <p class="sidenote multi">(Hold the ctrl (pc) or cmd (Mac) keys for multi-selects) </p> <select class="select-long" multiple size="5" name="field_36[]" id="field_36"><option value="0">- select all -</option> <option selected value="73" title="Permanent">Permanent</option> <option value="74" title="Temporary">Temporary</option> <option value="75" title="Fixed-term">Fixed-term</option> <option value="81" title="Intern">Intern</option></select> </div>

de lo cual es fácil suponer que field_36[] controla el Contract Type y el valor 73 corresponde a "Permanente", 74 corresponde a "Temporal", etc. De forma similar, puede averiguar las opciones para field_37[] , field_32[] y all (que puede ser cualquier cadena de término de búsqueda). Si tiene una buena comprensión de HTML, es posible que ni siquiera necesite la herramienta del navegador para construir el POST.