2013-07-24 22 views
5

Ci sono molti siti che usano questo (imo) fastidioso stile "scrolling infinito". Esempi di questo sono siti come tumblr, twitter, 9gag, ecc.simula lo scrolling infinito in C# per ottenere l'html completo di una pagina

Recentemente ho provato a ritagliare alcune immagini da questi siti in modo programmatico con HtmlAgilityPack. come questo:

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

Questo funziona bene, ma quando ho provato a caricare nel codice HTML da alcuni siti, ho notato che ho ricevuto solo indietro una piccola quantità di contenuti (diciamo i primi 10 "messaggi" o "immagini", o qualsiasi altra cosa ..) Questo mi ha fatto chiedere se fosse possibile simulare lo "scorrimento verso il basso" della pagina in C#.

Questo non è solo il caso in cui carico l'html in modo programmatico, quando vado semplicemente su siti come tumblr, e controllo firebug o semplicemente "visualizza sorgente", mi aspettavo che tutto il contenuto sarebbe lì da qualche parte, ma molto sembra essere nascosto/inserito con javascript. Solo il contenuto che è effettivamente visibile sul mio schermo è presente nel codice sorgente HTML.

Quindi le mie domande sono: è possibile simulare lo scorrimento infinito verso una pagina e il caricamento in quell'HTML con C# (preferibilmente)?

(So che posso usare API per Tumblr e Twitter, ma sto solo cercando di divertirsi un po 'di hacking cose insieme con HtmlAgilityPack)

risposta

4

Non v'è alcun modo per fare in modo affidabile questo per tutti questi siti web in un colpo, a corto di incorporare un browser web (che in genere non funziona in ambienti senza headless).

Quello che dovresti prendere in considerazione, invece, è guardare il codice JavaScript del sito per vedere quali query AJAX vengono utilizzate per recuperare il contenuto mentre l'utente scorre verso il basso.

In alternativa, utilizzare un debugger Web nel browser (ad esempio quello incluso in Chrome). Questi debugger di solito hanno un pannello "rete" che puoi utilizzare per ispezionare le richieste AJAX eseguite dalla pagina. L'esame di queste richieste mentre scorri verso il basso dovrebbe fornire informazioni sufficienti per scrivere codice C# che simula tali richieste.

Sarà quindi necessario analizzare la risposta da tali richieste come qualsiasi tipo di contenuto fornito da una determinata API, che probabilmente sarà JSON o XML, ma quasi certamente non HTML. (Questo potrebbe essere comunque meglio per te, poiché ti farà risparmiare dover analizzare HTML orientato alla visualizzazione, mentre l'API AJAX ti fornirà oggetti dati che dovrebbero essere molto più facili da usare.)

1

Questi siti stanno facendo asincroni richieste http per caricare i contenuti della pagina successiva. Dal momento che il pacchetto agilità HTML non ha un interprete javascript (grazie a Dio per questo), dovrai effettuare tali richieste tu stesso. È molto probabile che la maggior parte dei siti non restituisca frammenti html, ma piuttosto JSON. Per fare ciò, dovrai usare un parser JSON, non il pacchetto agility HTML.

Problemi correlati