C# - komponenta

Od: Datum: 10.02.13 19:07 odpovědí: 5 změna: 11.02.13 00:35

Dobrý den, jsem student - začínající programátor a řeším takový delikátní problém v C#... mám formulářovou aplikaci s komponentou WebBrowser a chci po ní následující:

- připoj se na k-tou URL ze seznamu

- načti zdroják dané stránky a ten ulož do řetězce

- vyfiltruj z něj data a ta přidej do dalšího řetězce

- opakuj, dokud takto neprojedeš všechny URL ze seznamu

Problém je, že program se sice připojí na stránky (resp. zahájí připojování), ale než se stačí celá stránka načíst, aby se mohl stáhnout její zdrojový kód, program přeskočí na další stránku, takže se načte jenom ta poslední (a ani u té se nestáhne zdroják napoprvé - k tomu musím spustit cyklus ještě jednou).

Zkoušel jsem breaknout cyklus s tím, že počká na načtení zdrojáku do stringu, ale to nefungovalo. Pokud zkusím vložit příkaz uspání (Thread.Sleep) před příkaz načtení zdrojáku, aby stránka měla čas se načíst, zamrzne i načítání stránky, takže se stejně projedou všechny bez stažení zdrojáku. Zkoušel jsem před uspání vložit i příkaz Application.DoEvents, ale ani s tím to nefungovalo.

Nemám to místo for/while cyklu zkusit regulovat třeba přes Timer? Popřípadě, existuje u komponenty prohlížeče nějaká možnost práce s načítáním stránky? Například něco jako "čekej, dokud stránka nebude načtena kompletně", nebo alespoň "nahlaš, zda byla stránka načtena kompletně". Nebo si mám rovnou napsat prohlížeč vlastní? Nebo jak se to dá vyřešit?


Seznam odpovědí:
 
moment čekejte prosím, probíhá přenos dat...
Zobrazení struktury odpovědí v otázce
Skrytí struktury odpovědí v otázce
Zobrazení struktury odpovědí v otázce

 

Odpovědi na otázku:
Datum: 10.02.13 19:58
avatar

proč to dělat tak složitě přes timery prosím vás? nebudu vám vymýšlet celý algoritmus, ale pouze Vás nasměruji: zkuste pohledat odchytávání událostí - zejména Vás bude zajímat událost DocumentCompleted ;)

Ohodnoceno: 0x
 
Datum: 10.02.13 19:58
avatar

Proč používat celý WebBrowser? To je na embedované interaktivní prohlížení stránek uživatelem. Použijte System.Net.HttpWebRequest, jakýkoli vygooglený příklad na GET request + příjem odpovědi do stringu/steamu bude dělat přesně to, co potřebujete. Nastavíte si tam nějaký timeout, případně retry podle stavu odpovědi (při 500.13 too busy, 503 unavailable), ke kterým se vrátíte po dokončení celého cyklu. A kdyby to mělo bejt joo promakaný, můžete requesty na odlišné domény posílat asynchronně.

doplněno 10.02.13 22:18:

Jestli je WebBrowser v zadání, zřejmě by bylo vhodné ho použít :)

Ohodnoceno: 2x
 
Datum: 10.02.13 20:08
avatar

Dle dotazu tazatele to vypadá tak, že má vše promyšlené a komponenta WebBrowser je použita záměrně. Způsobů jak dosáhnout stažení zdrojového kodu ze stránek je hned několik, ale pokud ve škole dostal zadání, ve kterém se mají studenti zorientovat při použití komponenty WebBrowser pravděpodobně nebude nejšťastnější řešení tuto komponentu zcela vyřadit z programu. Avšak i Váš návrh je zcela korektní. S tím rozdílem, že použití komponenty WebBrowser je poněkud snažší dle mého názoru. Cyklicky projít list a při každém načtení URL adresy odchytit událost DocumentCompleted, kde se stáhne celý DOM a předá se další metodě, která bude parsovat požadovanou část documentu a případně jí dále zpracovat.. otázka pár řádků

doplněno 10.02.13 20:12:

ve visual studiu v návrhovém zobrazení si naklikejte toto:

doplněno 10.02.13 20:15:

a následně po double clicku do políčka DocumentCompleted se automaticky přepnete do zdrojového kódu, kde se automaticky vytvoří zachycení události + metoda, která je pro vaše účely žádaná. viz obrázek:

http://clip2net.com/clip/m106629/1360523632-clip-28kb.png

Ohodnoceno: 2x
 
Od: havlicek*
Datum: 10.02.13 22:29

Tak jsem to udělal podobně jak říkáte - načtu adresy do seznamu, stiskem tlačítka se připojím na první stránku a tu pak podchytím metodou DocumentCompleted, která vyfiltruje data a připojí se na další stránku, z té po kompletním načtení opět vyfiltruje data atd. (metoda tak volá sama sebe, dokud nedojde k poslední stránce).

Metoda však funguje poněkud chaoticky, místy se zdá, že se na některé stránky připojuje vícekrát. Ale třeba mám jenom blbě algoritmus, protože jsem někde něco přehlédl, každopádně děkuji za rady.

Datum: 11.02.13 00:35
avatar

pravděpodobně budete mít špatně algoritmus, protože tahle metoda je zavolána POUZE při kompletním načtení stránky a pak předá řízení běhu programu tam, odkud byla vyvolána. nic jiného nedělá.

doplněno 11.02.13 00:37:

případně postněte váš zdroják na portál pastebin.com a pošlete sem link..já vám na to kouknu jestli máte zájem

Ohodnoceno: 0x
 

 

 

Přihlásit se k odběru odpovědí z této otázky:

Neneseme odpovědnost za správnost informací a za škodu vzniklou jejich využitím. Jednotlivé odpovědi vyjadřují názory jejich autorů a nemusí se shodovat s názorem provozovatele poradny Poradte.cz

 
Copyright © 2004-2016 Poradna Poradte.cz. Všechna práva na poradně Poradte.cz vyhrazena.