2011-12-31 18 views
5

páginas Normalmente que tienen un formulario de acceso se pueden descargar con¿Cómo descargar páginas que redirigen después del inicio de sesión?

wget --no-check-certificate --save-cookies cookies --keep-session-cookies \ 
    --post-data="username=example&password=example" \ 
    "https://example.com/index.php?title=Special:Userlogin&returntotitle=" 

wget --no-check-certificate --load-cookies=cookies \ 
    --no-parent -r --level=2 -nc -E \ 
    https://example.com/Special:Sitemap 

Pero en el caso de los sitios DekiWiki, esto no funciona, si se requiere inicio de sesión.

El problema costuras que se describen en man wget

Nota: si Wget es redirigido después de la solicitud POST se ha completado, no enviará los datos POST a la URL redirigida. Esto se debe a que las URL que procesan POST a menudo responden con una redirección a una página normal, que no desea ni acepta POST. No es que este comportamiento sea óptimo; si no funciona, podría ser cambiado en el futuro.

Pregunta

se puede hacer esto usando Perl, por ejemplo, con quizás HTML::TreeBuilder 3 o HTML::TokeParser o Mechanize o cualquier otro módulo de Perl?

Respuesta

4

Algunos sitios que requieren un inicio de sesión no envían la cookie con la respuesta.

En su lugar, envían una respuesta de redirección (302 Object Moved), que la mayoría de los navegadores siguen automáticamente y luego la cookie se envía en la respuesta para esa página de redirección.

Utilizo curl para hacer esto habilitando curl_opt FOLLOW_LOCATION, para la herramienta de línea de comandos uno usa la opción -location. Es una herramienta gratuita como wget.

curl --cookie cookie.txt --cookie-jar cookie.txt \ 
    --data-urlencode "username=example&password=example" \ 
    --insecure --location https://example.com/index.php?title=Special:Userlogin&returntotitle= -o downloadedfile.html https://example.com/Special:Sitemap 

http://curl.haxx.se/download.html

También, a veces un formulario de acceso espera un poste/form-data multi-parte en lugar de sólo un post urlencoded-x-www-formulario de solicitud /. Para hacer que curl haga un cambio de publicación de múltiples partes/datos de formulario a --data-urlencode a -F.

+0

Muy interesante. ¿También es posible duplicar el sitio? En mi ejemplo, uso wget's '--no-parent -r --level = 2'. –

+1

¿Quiere decir descargar recursivamente todas las páginas apuntadas desde la página original? No, curl tiene -r --level = 2 equivalentes, sin embargo, libcurl, una interfaz API, podría programarse fácilmente para analizar una página html y descargar todos los enlaces en esa página. Libcurl tiene enlaces para los siguientes idiomas (y más): C, C++, Java, Lisp, .NET, Pascal de objetos, Pascal, Perl, PHP, Python, Ruby, Visual Basic – Motes

+0

@Motes, "-cookie-jar" necesita ser cambiado a "--cookie-jar", ¿verdad? – Sathish

Cuestiones relacionadas