CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - crowler http

crowler http

problemy z tworzeniem programów do obsługi sieci, internetu, e-mail itp..

crowler http

Nowy postprzez grigorij89 » poniedziałek, 18 lipca 2011, 11:57

witam
Piszę aplikacją będącą pewnym rodzajem http, crowler'a. Ma on na bazie zadanych słów kluczowych zadawać zapytania do wyszukiwarek. Na podstawie wyszukanych linków- tworzy listę i odwiedza strony tworząc raport.
Zacząłem od czegoś takiego. Na dysku tworzę plik w którym wpisywane będą słowa kluczowe. Teraz potrzebowałbym moduł, który mając te słowa zada pytanie do wyszukiwarki( na początek załóżmy do google) i wypisze listę adresów. Skorzystałem z http://programowanie.cal.pl/cyfbar/siec.html#siec10 i porady jak wyciągnąć adresy URL ze stron internetowych. Jednak problemem jest to ,że dla zadanej strony działa on dobrze, jednak z wyszukiwarką nie wypisuje mi url wyszukanych stron.
Jakieś porady, wskazówki co do tej aplikacji ?
Avatar użytkownika
grigorij89
Bladawiec
Bladawiec
 
Posty: 11
Dołączył(a): czwartek, 14 kwietnia 2011, 19:19
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Ubuntu 10.10
Kompilator: Embarcadero RAD Studio 2010
Visual Studio 2008
Gadu Gadu: 8442357
    Windows 7Firefox

Re: crowler http

Nowy postprzez Darek_C++ » piątek, 22 lipca 2011, 00:08

Należy zastosować wyrażenia regularne np Boost.Regex do wyciągania adresów lub napisać własny parser wyciągający interesujące cię treści = ciągi znaków o określonej budowie. Należy też pamiętać, że jak zadasz za wiele zapytań w określonej jednostce czasu [krótki czas] z tego samego IP dostaniesz tak zwanego bana na twoje IP.

Za ten post autor Darek_C++ otrzymał podziękowanie od:
grigorij89
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: crowler http

Nowy postprzez grigorij89 » środa, 27 lipca 2011, 10:40

Darek_C++ napisał(a):Należy zastosować wyrażenia regularne np Boost.Regex do wyciągania adresów lub napisać własny parser wyciągający interesujące cię treści = ciągi znaków o określonej budowie. Należy też pamiętać, że jak zadasz za wiele zapytań w określonej jednostce czasu [krótki czas] z tego samego IP dostaniesz tak zwanego bana na twoje IP.


Dzięki za pomoc co do parsera to wykorzystałem ten podany przez Cyfrowego Barona w poradach. Jak na razie działa poprawnie, co do RegExp'a to się wstrzymam.
Aplikacja tworzy się i jest już na dość dalekim etapie, natomiast mam problem. Wczytuje sobie z pliku słowa kluczowe (jedno słowo w każdej linijce, albo fraza) do listy TStringList.
KOD cpp:     UKRYJ  
void __fastcall TForm1::Button3Click(TObject *Sender)
{
        TStringList *Lista = new TStringList;
        if (OpenDialog1->Execute())
        {
                Lista->LoadFromFile(OpenDialog1->FileName);
        }

}

Następnie słowa z tej listy przekazuje do funkcji GetAdressURL po to, aby wyświetlić wyniki na Memo (adresy URL).
KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender,TStringList* Lista)
{
        Label2->Visible = True;
        for(int i = 0; i < 100; i++)
        {
                ProgressBar1->Position += 1;
                Sleep(100);
                Application->ProcessMessages();
        }
        for(int i = 0; i < Lista->Count; i++)
       {
            Memo1->Lines = GetAdressURL(urlBing + Lista->Strings[i]);                                                           // dodaje adres url do memo
            Memo1->Lines->Add("#######################################");
            Label2->Visible = False;
            delete Lista;
}

Kompiluje się bez problemu natomiast aplikacja nie działa jak powinna. Jej działanie jakby zawiesza się w momencie kliknięcie przycisku pokaż wynik. Proszę o pomoc pewnie przyczyna jest banalna, ale nie potrafię do niej dojść.
Avatar użytkownika
grigorij89
Bladawiec
Bladawiec
 
Posty: 11
Dołączył(a): czwartek, 14 kwietnia 2011, 19:19
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Ubuntu 10.10
Kompilator: Embarcadero RAD Studio 2010
Visual Studio 2008
Gadu Gadu: 8442357
    Windows 7Firefox

Re: crowler http

Nowy postprzez Cyfrowy Baron » środa, 27 lipca 2011, 11:49

grigorij89 napisał(a):Jej działanie jakby zawiesza się w momencie kliknięcie przycisku pokaż wynik.


Masz tam dwie pętle, ale tylko w jednej odświeżasz kolejkę komunikatów funkcją Application->ProcessMessages(). Umieść tą funkcję również w drugiej pętli.
Dodatkowe opóźnienie powoduje funkcja Sleep, która po prostu wstrzymuje aplikację. Zastanów się, czy zależy Tabie na tym by obrazować proces parsowania za pomocą ProgressBar, czy raczej wolisz by aplikacja działała szybko. Funkcja Sleep jest tutaj absolutnie zbędna i tylko szkodzi, miast pomagać.

Ten kod zawiera błąd:
grigorij89 napisał(a):
KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender,TStringList* Lista)
{
        Label2->Visible = True;
        for(int i = 0; i < 100; i++)
        {
                ProgressBar1->Position += 1;
                Sleep(100);
                Application->ProcessMessages();
        }
        for(int i = 0; i < Lista->Count; i++)
       {
            Memo1->Lines = GetAdressURL(urlBing + Lista->Strings[i]);                                                           // dodaje adres url do memo
            Memo1->Lines->Add("#######################################");
            Label2->Visible = False;
            delete Lista;
}


Powinno być:

KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender,TStringList* Lista)
{
        Label2->Visible = True;
        for(int i = 0; i < 100; i++)
        {
                ProgressBar1->Position += 1;
                Sleep(100);
                Application->ProcessMessages();
        }
        for(int i = 0; i < Lista->Count; i++)
       {
            Memo1->Lines = GetAdressURL(urlBing + Lista->Strings[i]);    // dodaje adres url do memo
       }                
                                       
            Memo1->Lines->Add("#######################################");
            Label2->Visible = False;
            delete Lista; // <-- BŁĄD !!!
}


Poza tym ta pierwsza pętla jest zbędna gdyż ona tylko porusza ProgressBar-em, który nie odzwierciedla tego co program robi. Zastanawiałeś się wogóle nad tym kodem.

Powinno to wyglądać tak:

KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender,TStringList* Lista)
{
        Label2->Visible = True;
       
       int iCount = Lista->Count;
       float fProgress = 100.00 / (float)iCount;
        for(int i = 0; i < iCount; i++)
       {
            Memo1->Lines = GetAdressURL(urlBing + Lista->Strings[i]);    // dodaje adres url do memo
           
            ProgressBar1->Position += (int)fProgress;          

           Application->ProcessMessages();
       }                
                                       
            Memo1->Lines->Add("#######################################");
            Label2->Visible = False;

           // delete Lista; - BŁĄD
}


delete Lista - dlaczego błąd?! Dlatego, że lista jest tworzona w zdarzeniu OnClick przycisku Button3 więc jest obiektem lokalnym niedostępnym poza tym zdarzeniem. Nie rozumiem jak ten kod w zaprezentowanej przez Ciebie postaci mógł się Tobie wogóle skompilować.
Jeżeli lista jest obiektem lokalnym to może być używana tylko lokalnie, jeżeli jest obiektem globalnym to nie należy jej niszczyć w zdarzeniu lokalnym gdyż po zniszczeniu obiekt nie będzie już dostępny.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
grigorij89
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: crowler http

Nowy postprzez polymorphism » środa, 27 lipca 2011, 12:54

W kwestii zmiennych lokalnych, globalnych i innych. Warto trzymać się pewnej konwencji nazywania zmiennych, szczególnie dotyczy to początkujących.

Czyli:
  • g_nazwa_zmiennej - zmienne globalne (g od global (variable))
  • m_nazwa_zmiennej - pola klas i struktur (m od (class) member).
  • nazwa_zmiennej - zwykłe zmienne lokalne.

Gdybyś trzymał się tej konwencji, szybciej wyłapałbyś błąd, o którym wspomniał Baron. Już nie mówiąc o tym, że kod się łatwiej analizuje.
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
grigorij89
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: crowler http

Nowy postprzez grigorij89 » środa, 27 lipca 2011, 15:38

Dzięki wielkie @polymorphism i @Cyfrowy Baron teraz już wszystko działa.
Mam jeszcze pytanie co do memo. Chce żeby wyniki były ładnie formatowane. Tzn jeśli mam w pliku ze słowami kluczowym coś takiego:
auto
bomba
kwiatek

Żeby było tak:
wyniki dla auto:
-
-
-
#############
wyniki dla bomba:
-
-
-
##############
wyniki dla kwiatek:
-
-
-
#############
Po prostu chce żeby mi dopisywał na koniec a nie nadpisywał linijki.
Avatar użytkownika
grigorij89
Bladawiec
Bladawiec
 
Posty: 11
Dołączył(a): czwartek, 14 kwietnia 2011, 19:19
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Ubuntu 10.10
Kompilator: Embarcadero RAD Studio 2010
Visual Studio 2008
Gadu Gadu: 8442357
    Windows 7Firefox

Re: crowler http

Nowy postprzez Cyfrowy Baron » czwartek, 28 lipca 2011, 07:51

Dla mnie pytanie o to formatowanie jest niezrozumiałe.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: crowler http

Nowy postprzez grigorij89 » czwartek, 28 lipca 2011, 10:10

Chcę aby w memo pojawiły się wyniki, każdego wywołania funkcji GetAdressURL(urlBing + Lista->Strings[i]), jedno pod drugim oddzielone #################.
Jak dokleić kolejne wyniki aby nie stracić pozostałych. Próbowałem zrobić += ale tak nie można.
Avatar użytkownika
grigorij89
Bladawiec
Bladawiec
 
Posty: 11
Dołączył(a): czwartek, 14 kwietnia 2011, 19:19
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Ubuntu 10.10
Kompilator: Embarcadero RAD Studio 2010
Visual Studio 2008
Gadu Gadu: 8442357
    Windows 7Firefox

Re: crowler http

Nowy postprzez Cyfrowy Baron » czwartek, 28 lipca 2011, 12:06

KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender,TStringList* Lista)
{
        Label2->Visible = True;
       
       int iCount = Lista->Count;
       float fProgress = 100.00 / (float)iCount;

       for(int i = 0; i < iCount; i++)
       {
            Memo1->Lines->AddStrings( GetAdressURL(urlBing + Lista->Strings[i]) );
            Memo1->Lines->Add("#######################################");
           
            ProgressBar1->Position += (int)fProgress;          

           Application->ProcessMessages();
       }
 
        Label2->Visible = False;

           // delete Lista; - BŁĄD
}

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
grigorij89
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje sieciowe

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 2 gości

cron