2011-12-31 54 views
5

trang thường có một hình thức đăng nhập có thể được tải vớiCách tải xuống các trang chuyển hướng sau khi đăng nhập?

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 

Nhưng trong trường hợp của các trang web Dekiwiki, điều này không làm việc, nếu đăng nhập là bắt buộc.

Vấn đề vỉa được mô tả trong man wget

Lưu ý: nếu wget được chuyển hướng sau khi yêu cầu POST được hoàn thành, nó sẽ không gửi dữ liệu POST để URL được chuyển hướng. Điều này là do các URL xử lý POST thường phản hồi với chuyển hướng đến trang thông thường, không mong muốn hoặc chấp nhận POST. Nó không phải là hoàn toàn rõ ràng rằng hành vi này là tối ưu; nếu nó không hoạt động, có thể là đã thay đổi trong tương lai.

Câu hỏi

này có thể được thực hiện bằng Perl ví dụ với có lẽ HTML::TreeBuilder 3 hoặc HTML::TokeParser hoặc Mechanize hoặc bất kỳ mô-đun Perl nào khác?

Trả lời

4

Một số trang web yêu cầu đăng nhập không gửi lại cookie với câu trả lời. Thay vào đó, họ gửi phản hồi chuyển hướng (302 đối tượng đã di chuyển), hầu hết các trình duyệt đều tự động theo dõi và sau đó cookie được gửi trong phản hồi cho trang chuyển hướng đó.

Tôi sử dụng curl để thực hiện việc này bằng cách bật curl_opt FOLLOW_LOCATION, để công cụ dòng lệnh sử dụng tùy chọn vị trí. Nó là một công cụ miễn phí như 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

Ngoài ra, đôi khi là một hình thức đăng nhập hy vọng một đa phần bài/form-data thay vì chỉ một bài application/x-www-form-urlencoded. Để làm cho curl làm một bài viết đa phần/biểu mẫu dữ liệu thay đổi thành anh ta --data-urlencode thành -F.

+0

Rất thú vị. Có thể phản chiếu trang web không? Trong ví dụ của tôi, tôi sử dụng '--no-parent -r --level = 2' của wget. –

+1

Bạn có nghĩa là đệ quy tải xuống tất cả các trang được trỏ đến từ trang gốc không? Không, curl cũng không -r --level = 2 tương đương, tuy nhiên, libcurl, một giao diện API, có thể dễ dàng được lập trình để phân tích cú pháp trang html và tải xuống tất cả các liên kết trong trang đó. Libcurl có các ràng buộc cho các ngôn ngữ sau (và nhiều hơn nữa): C, C++, Java, Lisp, .NET, Object-Pascal, Pascal, Perl, PHP, Python, Ruby, Visual Basic – Motes

+0

@Motes, "-cookie-jar" cần phải được thay đổi thành "--cookie-jar", phải không? – Sathish

Các vấn đề liên quan