example - ¿Utilizando Python/Selenium/Best Tool For The Job para obtener URI de las solicitudes de imágenes generadas a través de JavaScript?
selenium web scraping (5)
Tengo un JavaScript de un proveedor de terceros que está iniciando una solicitud de imagen. Me gustaría descubrir el URI de esta solicitud de imagen.
Puedo cargar la página en mi navegador, y luego monitorear "Live HTTP Headers" o "Tamper Data" para descubrir el URI de solicitud de imagen, pero preferiría crear un proceso de línea de comando para hacer esto.
Mi intuición es que podría ser posible usar python + qtwebkit, pero tal vez haya una mejor manera.
Para aclarar: podría tener esto (código excesivamente simplificado).
<script>
suffix = magicNumberFunctionIDontHaveAccessTo();
url = "http://foobar.com/function?parameter=" + suffix
img = document.createElement(''img''); img.src=url; document.all.body.appendChild(img);
</script>
Luego, una vez que se carga la página, puedo averiguar la URL olfateando los paquetes. Pero no puedo averiguarlo desde la fuente, porque no puedo predecir el resultado de magicNumberFunction ... ().
¡Cualquier ayuda sería muy apreciada!
Gracias.
¿Por qué no puedes simplemente leer el suffix
o url
para ese asunto? ¿La imagen está cargada en un iframe o en tu página?
Si está cargado en su página, puede ser un hack sucio (sustituya document.body por cualquier elemento que se considere):
var ac = document.body.appendChild;
var sources = [];
document.body.appendChild = function(child) {
if (/^img$/i.test(child.tagName)) {
sources.push(child.getAttribute(''src''));
}
ac(child);
}
Lo más simple que puede hacer es usar algo como HtmlUnit y omitir un navegador real por completo. Al usar Rhino, puede evaluar JavaScript y probablemente se use para extraer esa URL.
Dicho eso, si no puede lograr que funcione, pruebe Selenium RC y use el comando captureNetworkTraffic (que requiere que el instante Selenium se inicie con la opción de captureNetworkTraffic = true). Esto abrirá Firefox con un proxy configurado y luego le permitirá volver a extraer la información de la solicitud como JSON / XML / texto sin formato. Luego puedes analizar ese contenido y obtener lo que deseas.
Pruebe la herramienta de prueba instantánea que ofrece mi empresa. Si los datos que está buscando están en nuestros resultados (después de hacer clic en Ver detalles), podrá obtenerlos de Selenium. Lo sé, desde que escribí la API CaptureNetworkTraffic para Selenium para mi empresa, BrowserMob.
Finalmente, lo hice en Python, usando Selenium-RC. Esta solución requiere los archivos python para selenium-rc, y usted necesita iniciar el servidor java ("java -jar selenium-server.jar")
from selenium import selenium
import unittest
import lxml.html
class TestMyDomain(unittest.TestCase):
def setUp(self):
self.selenium = selenium("localhost", /
4444, "*firefox", "http://www.MyDomain.com")
self.selenium.start()
def test_mydomain(self):
htmldoc = open(''site-list.html'').read()
url_list = [link for (element, attribute,link,pos) in lxml.html.iterlinks(htmldoc)]
for url in url_list:
try:
sel = self.selenium
sel.open(url)
sel.select_window("null")
js_code = ''''''
myDomainWindow = this.browserbot.getUserWindow();
for(obj in myDomainWindow) {
/* This code grabs the OMNITURE tracking pixel img */
if ((obj.substring(0,4) == ''s_i_'') && (myDomainWindow[obj].src)) {
var ret = myDomainWindow[obj].src;
}
}
ret;
''''''
omniture_url = sel.get_eval(js_code) #parse&process this however you want
except Exception, e:
print ''We ran into an error: %s'' % (e,)
self.assertEqual("expectedValue", observedValue)
def tearDown(self):
self.selenium.stop()
if __name__ == "__main__":
unittest.main()
Use el complemento Firebug Firefox . Le mostrará todas las solicitudes en tiempo real e incluso puede depurar el JS en su navegador o ejecutarlo paso a paso.
Escogería cualquiera de los muchos servidores proxy http escritos en Python, probablemente uno de los más simples en la parte superior de la lista, y lo retocaría para registrar todas las URL solicitadas (así como proxy-serve), por ejemplo, anexando. a un archivo de texto, sin pérdida de generalidad, llame a ese archivo de texto ''XXX.txt''.
Ahora todo lo que necesita es un script que: inicie el servidor proxy en cuestión; inicia Firefox (o lo que sea) en su URL principal deseada con el proxy en cuestión establecido como su proxy (vea, por ejemplo, esta pregunta SO ), aunque estoy seguro de que otros navegadores funcionarían igual de bien; espera un poco (por ejemplo, hasta que el archivo XXX.txt del proxy no haya sido alterado por más de N segundos); lee XXX.txt para extraer solo las URL que le interesan y grabarlas donde lo desee; rechaza los procesos proxy y Firefox.
Creo que será mucho más rápido implementarlo y hacer que funcione correctamente, para sus requisitos específicos, que cualquier solución más general basada en qtwebkit, selenio u otros "kits de automatización".