2011-12-31 19 views
5

Normalde sayfalarOturum açtıktan sonra yönlendiren sayfalar nasıl karşıdan yüklenir? Bir giriş formu var

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 

ile indirilebilir Ama giriş gerekiyorsa DekiWiki sitelerin durumunda, bu, işe yaramaz.

sorun dikişler man wget

Not tarif edilecek: Wget'i POST isteği tamamlandıktan sonra, yönlendirilen URL'ye POST veri göndermez yönlendirilir eğer. Bunun nedeni, POST'u işleyen URL'lerin genellikle, POST'ı istemeyen veya kabul etmeyen normal bir sayfaya yeniden yönlendirmeyle yanıtı vermesidir. Bu davranışın optimal olduğunu tamamen açık değildir; Eğer çalışmazsa, ileride değişmiş olabilir.

Soru

bu örneğin Perl kullanarak yapılabilir Can belki HTML::TreeBuilder 3 veya HTML::TokeParser veya Mechanize veya başka bir Perl modülü ile?

cevap

4

Giriş yapmak isteyen bazı siteler, çerezi yanıtla birlikte göndermez. Bunun yerine, çoğu tarayıcının otomatik olarak izlediği bir yönlendirme yanıtı (302 Nesne Taşındı) gönderir ve ardından bu yönlendirme sayfasının yanıtında tanımlama bilgisi gönderilir.

Curl_opt FOLLOW_LOCATION öğesini etkinleştirerek bunu yapmak için curl kullanıyorum, komut satırı aracı için -location seçeneği kullanılır. Bu wget gibi ücretsiz bir araçtır.

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

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 

Ayrıca, bazen bir giriş formu bunun yerine sadece bir uygulama/x-www-form-urlencoded direğinin bir çok parçalı/form-yayını bekler. Kıvrılma yapmak için çok bölümlü/form-data post-he-data-urlenkoduna -F.

+0

Çok ilginç. Siteyi yansıtmak da mümkün mü? Örneğimde wget '--no-parent -r --level = 2' kullanıyorum. –

+1

Orijinal sayfadan işaret edilen tüm sayfaları art arda indirmek mi istiyorsunuz? Hayır, curl'in ne de -r --level = 2 eşdeğeri vardır, ancak bir API arabirimi olan libcurl, bir html sayfasını ayrıştırmak için kolayca programlanabilir ve bu sayfadaki tüm bağlantıları indirebilir. Libcurl aşağıdaki diller (ve daha fazlası) için bağlamalar vardır: C, C++, Java, Lisp, .NET, Object-Pascal, Pascal, Perl, PHP, Python, Ruby, Visual Basic – Motes

+0

@Motes, "-cookie-jar" "--cookie-jar" olarak değiştirilmeli, değil mi? – Sathish

İlgili konular