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.
Hay varias cosas que puede considerar usar:
-
mechanize
-
robobrowser
-
selenium
con un navegador sin cabeza, comoPhantomJS
, por ejemplo, o usando un navegador normal, pero en una pantalla virtual