2013-07-24 57 views
5

Có rất nhiều trang web sử dụng kiểu "cuộn vô hạn" gây phiền nhiễu (imo) này. Ví dụ về các trang web này như tumblr, twitter, 9gag, v.v.mô phỏng cuộn vô hạn trong C# để nhận được html đầy đủ của một trang

Gần đây tôi đã cố gắng loại bỏ một số bức ảnh của các trang web này theo lập trình với HtmlAgilityPack. như thế này:

HtmlWeb web = new HtmlWeb(); 
HtmlDocument doc = web.Load(url); 
var primary = doc.DocumentNode.SelectNodes("//img[@class='badge-item-img']"); 
var picstring = primary.Select(r => r.GetAttributeValue("src", null)).FirstOrDefault(); 

này hoạt động tốt, nhưng khi tôi đã cố gắng để tải trong HTML từ các trang web nhất định, tôi nhận thấy rằng tôi chỉ có lại một lượng nhỏ nội dung (cho phép nói 10 "bài" đầu tiên hoặc "hình ảnh", hoặc bất cứ điều gì ..) Điều này làm cho tôi tự hỏi nếu nó sẽ có thể mô phỏng "di chuyển xuống dưới cùng" của trang trong C#. Đây không chỉ là trường hợp khi tôi tải html theo chương trình, khi tôi đơn giản truy cập các trang web như tumblr, và tôi kiểm tra firebug hoặc chỉ "xem nguồn", tôi mong rằng tất cả nội dung sẽ ở trong một nơi nào đó, nhưng rất nhiều của nó có vẻ là ẩn/chèn với javascript. Chỉ nội dung thực sự hiển thị trên màn hình của tôi mới có trong nguồn HTML.

Vì vậy, câu hỏi của tôi là: có thể mô phỏng cuộn vô hạn xuống một trang và tải trong HTML đó với C# (tốt hơn) không?

(tôi biết rằng tôi có thể sử dụng của API cho tumblr và twitter, nhưng tôi chỉ cố gắng để có một số vui vẻ hack những thứ cùng với HtmlAgilityPack)

Trả lời

4

Không có cách nào đáng tin cậy làm điều này cho tất cả các trang web như vậy trong một lần chụp, ngắn nhúng trình duyệt web (thường sẽ không hoạt động trong môi trường không có đầu).

Thay vào đó, bạn nên xem xét JavaScript của trang web để xem truy vấn AJAX nào được sử dụng để tìm nạp nội dung khi người dùng cuộn xuống.

Hoặc, sử dụng trình gỡ lỗi web trong trình duyệt của bạn (chẳng hạn như trình gỡ lỗi web được bao gồm trong Chrome). Các trình gỡ rối này thường có ngăn "mạng" bạn có thể sử dụng để kiểm tra các yêu cầu AJAX được thực hiện bởi trang. Nhìn vào các yêu cầu này khi bạn cuộn xuống sẽ cung cấp cho bạn đủ thông tin để viết mã C# mô phỏng các yêu cầu đó.

Sau đó, bạn sẽ phải phân tích phản hồi từ các yêu cầu đó như bất kỳ loại nội dung nào mà API cụ thể phân phối, có thể là JSON hoặc XML, nhưng gần như chắc chắn không phải HTML. (Tuy nhiên, điều này có thể tốt hơn cho bạn, vì nó sẽ giúp bạn tiết kiệm phân tích HTML định hướng hiển thị, trong khi AJAX API sẽ cung cấp cho bạn các đối tượng dữ liệu dễ sử dụng hơn nhiều.)

1

Các trang web đó không đồng bộ http yêu cầu tải nội dung trang tiếp theo. Vì gói nhanh nhẹn HTML không có trình thông dịch javascript (cảm ơn trời), bạn sẽ cần tự mình thực hiện các yêu cầu đó. Rất có thể là hầu hết các trang web sẽ không trả về các đoạn html, mà đúng hơn là JSON. Để làm được điều đó, bạn sẽ cần phải sử dụng một trình phân tích cú pháp JSON, không phải là gói nhanh nhẹn HTML.