[ Boneli @ 18.06.2012. 03:13 ] @
Pozdrav!

Pravim aplikaciju u C#-u koja između ostalog treba da preuzme nekoliko hiljada članaka sa Vikipedije. Na primer, za preuzimanje jedne stranice, fragment koda bi trebalo ovako da izgleda:

Code:
WebClient webClient = new WebClient();
string URL = "http://en.wikipedia.org/wiki/Belgrade";
string FileName = @"C:\Belgrade.htm";
webClient.DownloadFile(URL, FileName);


Međutim, za neke članke taj kod odrađuje posao, a za neke ne i tada prijavljuje grešku: The remote server returned an error: (403) Forbidden.

Takođe, dodavao sam pre poziva webClient.DownloadFile(URL, FileName) i

Code:
string userAgent = "XYZ";
webClient.Headers.Add(HttpRequestHeader.UserAgent, userAgent);


gde sam umesto XYZ stavljao raznorazne stvari, što sam uspeo da izguglam, ali to i dalje nije rešilo problem. Tada se desi da mi preuzimanje određenog članka čas ne radi, a onda za isti kod iz čista mira proradi, ali pravi problem sa nekim drugim člankom. Poštovao sam ova pravila praveći dovoljnu pauzu između svaka dva preuzimanja, tako da mislim da nije u tome problem.

Zna li neko šta bi moglo da bude u pitanju?
[ ravni @ 18.06.2012. 08:28 ] @
Stavi da ti je razmak izmedju dva preuzimanja 30s pa vidi da li ce uspeti. Ako uspe, mozes da smanjujes period dok ne pocnes opet da dobijas status 403.
[ Boneli @ 18.06.2012. 09:39 ] @
Povećavao sam pauzu i znatno više od pola minuta, ali izgleda da nije do toga.
[ dejanet @ 18.06.2012. 10:41 ] @
Citat:
Tada se desi da mi preuzimanje određenog članka čas ne radi, a onda za isti kod iz čista mira proradi, ali pravi problem sa nekim drugim člankom.


Kod ovakvih slucajeva (radi i ne radi spoljni service) pod uslovom da si isposhtovao pravila, dodaj 'retry' sekvencu na obradu greske ("(403) Forbidden") gde ce program probati n predefinisanih retries (pokusaja).
[ Boneli @ 18.06.2012. 12:01 ] @
Izgleda da sam rešio problem. Program je pokušavao da preuzme jedan te isti članak na četiri jezika u razmaku od nekoliko sekundi, pa tek onda prelazi na drugi članak sa engleske Vikipedije. Sad sam pustio da prvo preuzme sve članke na engleskom, pa ću tek onda pustiti na drugim jezicima, ali ne uporedo nego jezik po jezik. I sve to radim u razmaku nešto većem od jedne sekunde. Zasad radi sat vremena, videćemo kako će se ponašati narednih sati, pošto još nije završio sa engleskim verzijama članaka.
[ Mihajlo Cvetanović @ 18.06.2012. 12:20 ] @
Ako smem da pitam, šta je svrha ovog poduhvata?
[ Boyka @ 18.06.2012. 12:40 ] @
Je l' mozes da izbacis ceo kod, bas me zanima kako se skida neki sadrzaj sa intrneta preko C#-a.
[ Boneli @ 18.06.2012. 12:43 ] @
Treba za seminarski iz nekog predmeta da ispišem listu svih gradova na svetu (pomoću Vikipedije), a onda izvučem informacije iz tih članaka na unapred definisan način. I to da uradim na engleskom i još nekoliko jezika. Najpre bih da ih preuzmem, pa onda da baratam offline sa njima. A ne preuzima mi se cela Vikipedija zbog "svega" 20-ak hiljada članaka, ovako ih je mnogo lakše procesuirati.
[ Boneli @ 18.06.2012. 12:52 ] @
Citat:
Boyka: Je l' mozes da izbacis ceo kod, bas me zanima kako se skida neki sadrzaj sa intrneta preko C#-a.


Nije ne znam kakva nauka, već sam napisao u prvoj poruci, evo ti fragment koda koji se trenutno izvršava. A prethodno sam u fajlu Cities.txt napisao spisak svih država i gradova što sam izvukao manje-više ručno.

Code:
   class Program
    {
        static int WAIT = 1100;

        static void DownloadMethod(WebClient webClient, string URL, string OutputFile)
        {
            System.Threading.Thread.Sleep(WAIT);
            try
            {
                webClient.DownloadFile(URL, OutputFile);
            }
            catch (Exception ex) 
            {
                StreamWriter sw = File.AppendText(@"C:\GreskeENG.txt");
                sw.WriteLine(OutputFile + "|" + ex.Message);
                sw.Close();
            }
        }

        static void Download(string Country, string City)
        {
            WebClient webClient = new WebClient();
            webClient.Headers["User-Agent"] = 
                @"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/A.B (KHTML, like Gecko) Chrome/X.Y.Z.W Safari/A.B.";
            Directory.CreateDirectory(@"C:\Cities\" + Country + @"\" + City);
            string URL = @"http://en.wikipedia.org/wiki/" + City.Replace(' ', '_');
            string OutputFile = @"C:\Cities\" + Country + @"\" + City + @"\[e] " + City + @".htm";
            DownloadMethod(webClient, URL, OutputFile);
        }

        static void Main(string[] args)
        {
            int brojac = 0;
            bool cities = false;
            string Country = "";
            string City = "";
            StreamReader sr = new StreamReader(@"C:\Cities\Cities.txt");
            while (!sr.EndOfStream)
            {
                brojac++;
                Console.Write(brojac + " ");
                string s = sr.ReadLine().Trim();
                Console.WriteLine(s);
                if (s.Equals(@"{"))
                    cities = true;
                else if (s.Equals(@"}"))
                    cities = false;
                else if (!cities)
                {
                    Country = s;
                    Directory.CreateDirectory(@"C:\Cities\" + Country);
                }
                else if (cities)
                {
                    City = s;
                    Download(Country, City);
                }
            }
        }
    }
[ Mihajlo Cvetanović @ 18.06.2012. 15:32 ] @
Za sastavljanje spiska verovatno se počelo od ovog linka http://en.wikipedia.org/wiki/Lists_of_cities_by_country
[ Boneli @ 18.06.2012. 16:53 ] @
Da, počeo sam sa tim linkom, pa odatle za svaku državu redom...