Estoy tratando de desarrollar un simple raspador web. Quiero extraer texto sin el código HTML. De hecho, logro este objetivo, pero he visto que en algunas páginas donde se carga JavaScript no obtuve buenos resultados.
Por ejemplo, si algún código JavaScript agrega texto, no puedo verlo, porque cuando llamo
response = urllib2.urlopen(request)
Recibo el texto original sin el agregado (porque JavaScript se ejecuta en el cliente).
Entonces, estoy buscando algunas ideas para resolver este problema.
python
web-scraping
python-2.x
urlopen
mocopera
fuente
fuente
Respuestas:
EDITAR 30 / Dic / 2017: esta respuesta aparece en los principales resultados de las búsquedas de Google, así que decidí actualizarla. La vieja respuesta todavía está al final.
dryscape ya no se mantiene y la biblioteca que recomiendan los desarrolladores de dryscape es solo Python 2. He encontrado que usar la biblioteca de Python de Selenium con Phantom JS como controlador web es lo suficientemente rápido y fácil de hacer el trabajo.
Una vez que haya instalado Phantom JS , asegúrese de que el
phantomjs
binario esté disponible en la ruta actual:Ejemplo
Para dar un ejemplo, creé una página de muestra con el siguiente código HTML. ( enlace ):
sin javascript dice:
No javascript support
y con javascript:Yay! Supports javascript
Raspado sin soporte JS:
Raspado con soporte JS:
También puede usar la biblioteca Python dryscrape para raspar sitios web controlados por javascript.
Raspado con soporte JS:
fuente
@Expenzor
Estoy trabajando en windows. PhantomJS funciona bien.No estamos obteniendo los resultados correctos porque cualquier contenido generado por JavaScript debe ser procesado en el DOM. Cuando buscamos una página HTML, buscamos la inicial, no modificada por javascript, DOM.
Por lo tanto, debemos procesar el contenido de JavaScript antes de rastrear la página.
Como el selenio ya se menciona muchas veces en este hilo (y también se menciona lo lento que se pone a veces), enumeraré otras dos posibles soluciones.
Solución 1: Este es un tutorial muy bueno sobre cómo usar Scrapy para rastrear contenido generado por JavaScript y vamos a seguir exactamente eso.
Lo que necesitaremos:
Docker instalado en nuestra máquina. Esto es una ventaja sobre otras soluciones hasta este punto, ya que utiliza una plataforma independiente del sistema operativo.
Instale Splash siguiendo las instrucciones enumeradas para nuestro sistema operativo correspondiente.
Citando de la documentación de bienvenida:
Esencialmente vamos a usar Splash para renderizar contenido generado por Javascript.
Ejecutar el servidor de salpicaduras:
sudo docker run -p 8050:8050 scrapinghub/splash
.Instale el complemento scrapy-splash :
pip install scrapy-splash
Suponiendo que ya tenemos un proyecto Scrapy creado (si no, hagamos uno ), seguiremos la guía y actualizaremos
settings.py
:Finalmente, podemos usar un
SplashRequest
:Solución 2: Llamemos a esto experimental en este momento (mayo de 2018) ...
Esta solución es solo para la versión 3.6 de Python (por el momento).
¿Conoces el módulo de solicitudes (bueno, quién no)?
Ahora tiene un pequeño hermano web que rastrea: peticiones-HTML :
Instalar request-html:
pipenv install requests-html
Haga una solicitud a la URL de la página:
Procese la respuesta para obtener los bits generados por Javascript:
Finalmente, el módulo parece ofrecer capacidades de raspado .
Alternativamente, podemos probar la forma bien documentada de usar BeautifulSoup con el
r.html
objeto que acabamos de renderizar.fuente
r.html.html
objeto.Quizás el selenio pueda hacerlo.
fuente
Si alguna vez ha usado el
Requests
módulo para Python antes, descubrí recientemente que el desarrollador creó un nuevo módulo llamadoRequests-HTML
que ahora también tiene la capacidad de representar JavaScript.También puedes visitar https://html.python-requests.org/ para obtener más información sobre este módulo, o si solo está interesado en representar JavaScript, puede visitar https://html.python-requests.org/?#javascript -Soporte para aprender directamente cómo usar el módulo para representar JavaScript usando Python.
Esencialmente, una vez que instala correctamente el
Requests-HTML
módulo, el siguiente ejemplo, que es muestra en el enlace anterior , muestra cómo puede usar este módulo para raspar un sitio web y renderizar JavaScript contenido en el sitio web:Recientemente me enteré de esto en un video de YouTube. ¡Haga clic aquí! para ver el video de YouTube, que demuestra cómo funciona el módulo.
fuente
Esta parece ser una buena solución también, tomada de una gran publicación de blog
fuente
Parece que se puede acceder a los datos que realmente está buscando a través de una URL secundaria llamada por algunos javascript en la página principal.
Si bien podría intentar ejecutar javascript en el servidor para manejar esto, un enfoque más simple podría ser cargar la página usando Firefox y usar una herramienta como Charles o Firebug para identificar exactamente cuál es esa URL secundaria. Luego, puede consultar directamente en esa URL los datos que le interesan.
fuente
El selenio es el mejor para raspar contenido JS y Ajax.
Consulte este artículo para extraer datos de la web usando Python
Luego descarga Chrome webdriver.
Fácil, verdad?
fuente
También puede ejecutar javascript usando webdriver.
o almacenar el valor en una variable
fuente
driver.title
propiedadPersonalmente prefiero usar scrapy y selenio y dockerizar ambos en contenedores separados. De esta forma, puede instalar ambos con una molestia mínima y rastrear sitios web modernos que casi todos contienen JavaScript de una forma u otra. Aquí hay un ejemplo:
Use el
scrapy startproject
para crear su raspador y escribir su araña, el esqueleto puede ser tan simple como esto:La verdadera magia ocurre en middlewares.py. Sobrescriba dos métodos en el middleware del descargador
__init__
yprocess_request
, de la siguiente manera:No olvide habilitar este middlware descomentando las siguientes líneas en el archivo settings.py:
Siguiente para la dockerización. Cree su imagen a
Dockerfile
partir de una imagen ligera (estoy usando python Alpine aquí), copie el directorio de su proyecto, instale los requisitos:Y finalmente reúne todo en
docker-compose.yaml
:Ejecutar
docker-compose up -d
. Si está haciendo esto la primera vez, le llevará un tiempo obtener el último selenio / cromo independiente y también construir su imagen de rascador.Una vez hecho esto, puede verificar que sus contenedores se estén ejecutando
docker ps
y también verificar que el nombre del contenedor de selenio coincida con el de la variable de entorno que pasamos a nuestro contenedor de raspador (aquí estabaSELENIUM_LOCATION=samplecrawler_selenium_1
).Ingrese su contenedor de raspador con
docker exec -ti YOUR_CONTAINER_NAME sh
, el comando para mí fuedocker exec -ti samplecrawler_my_scraper_1 sh
, cd en el directorio correcto y ejecute su raspador conscrapy crawl my_spider
.Todo está en mi página de Github y puedes obtenerlo desde aquí.
fuente
Una mezcla de BeautifulSoup y Selenium me funciona muy bien.
PD Puedes encontrar más condiciones de espera aquí
fuente
Querrá usar urllib, peticiones, beautifulSoup y el controlador web de selenio en su secuencia de comandos para diferentes partes de la página, (por nombrar algunas).
A veces obtendrá lo que necesita con solo uno de estos módulos.
A veces necesitará dos, tres o todos estos módulos.
A veces necesitará apagar el js en su navegador.
A veces necesitarás información de encabezado en tu script.
Ningún sitio web se puede eliminar de la misma manera y ningún sitio web se puede eliminar de la misma manera para siempre sin tener que modificar su rastreador, generalmente después de unos meses. ¡Pero todos pueden ser raspados! Donde hay voluntad hay una manera segura.
Si necesita datos raspados continuamente en el futuro, simplemente raspe todo lo que necesita y almacénelos en archivos .dat con pickle.
Simplemente siga buscando cómo probar qué con estos módulos y copiando y pegando sus errores en Google.
fuente
Usando PyQt5
fuente
He estado tratando de encontrar respuesta a estas preguntas durante dos días. Muchas respuestas lo dirigen a diferentes problemas. Pero la respuesta anterior de serpentr es realmente al punto. Es la solución más corta y simple. Solo un recordatorio de que la última palabra "var" representa el nombre de la variable , por lo que debe usarse como:
fuente
He tenido que lidiar con este mismo problema en algunos proyectos propios de scraping web. La forma en que lo traté fue mediante el uso de la biblioteca de solicitudes de Python para hacer una solicitud http directamente a la API, en lugar de tener que cargar el JS.
La biblioteca de solicitudes de Python funciona bien para esto, y puede ver las solicitudes http utilizando el elemento de inspección y navegando a la pestaña de red.
fuente