2013-07-24 35 views
5

Istnieje wiele witryn, które używają tego (imo) irytującego stylu "nieskończonego przewijania". Przykładami są witryny takie jak tumblr, twitter, 9gag, itp.zasymuluj nieskończone przewijanie w języku C#, aby uzyskać pełny HTML strony

Niedawno próbowałam skrobać niektóre zdjęcia z tych stron programowo za pomocą HtmlAgilityPack. tak:

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(); 

Działa to dobrze, ale kiedy próbowałem wczytać w HTML z niektórych stron, zauważyłem, że ja tylko wróciłam niewielką ilość treści (powiedzmy 10 pierwszych „posty” lub "zdjęcia", czy cokolwiek ..) To sprawiło, że zastanawiam się, czy byłoby możliwe symulowanie "przewijania w dół" strony w języku C#.

Nie jest tak tylko w przypadku, gdy ładuję html programowo, kiedy po prostu odwiedzam strony takie jak tumblr, sprawdzam firebuga lub po prostu "wyświetl źródło", spodziewałem się, że cała zawartość będzie gdzieś tam, ale dużo z tego wydaje się być ukryty/wstawiony z javascript. Tylko treść widoczna na moim ekranie jest obecna w źródle HTML.

Moje pytania brzmią: czy możliwe jest symulowanie nieskończonego przewijania w dół do strony i ładowanie w tym kodzie HTML za pomocą C# (najlepiej)?

(wiem, że mogę korzystać z API dla tumblr i twitter, ale jestem po prostu staramy się zabawić hacking rzeczy razem z HtmlAgilityPack)

Odpowiedz

4

nie ma sposobu, aby w wiarygodny sposób to zrobić dla wszystkich takich witryn w jednym ujęciu, bez osadzania przeglądarki internetowej (która zazwyczaj nie działa w środowiskach bezgłowych).

Zamiast tego należy rozważyć JavaScript w witrynie, aby zobaczyć, jakie zapytania AJAX są używane do pobierania treści, gdy użytkownik przewija w dół.

Można również użyć debugera internetowego w przeglądarce (takiego jak ten uwzględniony w przeglądarce Chrome). Te debuggery zwykle mają panel "sieciowy", za pomocą którego można sprawdzać żądania AJAX wykonywane przez stronę. Przeglądanie tych żądań podczas przewijania w dół powinno dostarczyć wystarczających informacji do napisania kodu C#, który symuluje te żądania.

Będziesz wtedy musiał przeanalizować odpowiedź z tych żądań jako typ treści dostarczanej przez konkretne API, które prawdopodobnie będą JSON lub XML, ale prawie na pewno nie HTML. (Może i tak będzie lepiej dla Ciebie, ponieważ zaoszczędzi ci to konieczności analizowania HTML zorientowanego na wyświetlanie, podczas gdy interfejs API AJAX da ci obiekty danych, które powinny być znacznie łatwiejsze w użyciu).

1

Te witryny robią asynchroniczne http żąda załadowania następnej zawartości strony. Ponieważ HTML agility pack nie ma interpretera javascript (dziękuję za to niebiosa), będziesz musiał sam je wykonać. Najprawdopodobniej większość witryn nie zwróci fragmentów html, ale raczej JSON. W tym celu musisz użyć parsera JSON, a nie pakietu agility HTML.