Strona 1 z 1

C++ i curl problem z konsekwencją programu.

: 17 grudnia 2009, 16:27
autor: bagsiur
Witam. Piszę fragment programu którego zadaniem jest pobranie treści zwracanych przez google (google jak to google, ma wyszukać strony pasujące do wpisanego hasła) w celu późniejszej obróbki (chcę uzyskać same linki do tych stron). W zasadzie cel osiągnąłem ale niestety nie do końca. Program faktycznie zwraca wyniki ale niestety raz na 3 uruchomienia, w większości przypadków okienko konsolowe porostu się wyłącza. Nie za bardzo wiem czym to jest spowodowane, a zależy mi na tym żeby zapętlić program, tak aby sprawdził min 10 podstron google.

Kod: Zaznacz cały

#include <string> 
#include <iostream> 
#include <curl/curl.h>
#include <vector>
using namespace std; 

string wynik;

static int geturl(char *data, size_t size, size_t nmemb, char *buffer){
  int result = 0; 
  wynik.append((const char*)data);
  result = size * nmemb;
  return result; 
}

string intToStr(int n){
string tmp, ret;
 if(n<0){
  ret="-";
  n=-n;
 }
 
do{
  tmp += n%10+48;
  n -= n%10;
}
while(n /= 10);

for(int i=tmp.size(); i>=0; i--) ret += tmp[i];
return ret;
}



size_t strpos(const string &haystack, const string &needle){
   
int sleng = haystack.length();
int nleng = needle.length();

if (sleng==0 || nleng==0) return string::npos;

    for(int i=0, j=0; i<sleng; j=0, i++ ){
        while (i+j<sleng && j<nleng && haystack[i+j]==needle[j]) j++;
        if (j==nleng) return i;
    }
    return string::npos;
}

//zaczynamy koniec z funkcjami :)
int main(){
int k,i,x,y;
string liczba,url,zmienna;
CURL *curl;

//for(k=0;k<=0;k=k+10){
k=80;
liczba=intToStr(k);
liczba.replace(0,1,"");
             
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
url="http://www.google.pl/search?hl=pl&source=hp&q=warszawa&lr=&btnG=Szukaj+w+Google&start="+liczba;
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, geturl);
curl_easy_perform(curl);
curl_easy_cleanup(curl);


x=strpos(wynik, "<h3 class=r><a href=\"");
y=strpos(wynik, "<caption class=\"med nobr\" style");
wynik=wynik.substr(x,y-x);


for(i=0;i<=10;++i){
x=strpos(wynik, "<h3 class=r><a href=\"");
y=strpos(wynik, "\" class=l");
zmienna=wynik.substr(x+21, y-x-21);
wynik=wynik.replace(x,y-x+9,"");

zmienna=zmienna.replace(0,7,"");
y=strpos(zmienna, "/");
zmienna=zmienna.substr(0, y);
if(i!=10) cout<<zmienna<<endl;
zmienna="";
}

 
system("pause");
return 0;
} 
byłbym wdzięczny gdyby ktoś wytłumaczył mi gdzie tkwi błąd...

: 17 grudnia 2009, 23:33
autor: jasiekmarc
A nie lepiej skorzystać z Google API? £atwiej się przetwarza, bo dostajesz gotową klasę z wynikami stablicowanymi, a nie jakiś straszny plik tekstowy. Na dodatek nie ma problemów licencyjnych.

Jeśli postanawiasz pozostać przy swojej koncepcji to rób klasyczny debug, czyli wypisz sobie na ekran (można cerr'em) wartości różnych ciekawych zmiennych po odpaleniu curla i patrz co się z nimi dzieje. Jeśli do tego momentu działa ok (choć wątpię, bo reszta powinna być zupełnie deterministyczna) to szukaj dalej.

: 18 grudnia 2009, 11:10
autor: bagsiur
wypisz sobie na ekran (można cerr'em) wartości różnych ciekawych zmiennych po odpaleniu curla i patrz co się z nimi dzieje

Próbowałem na wszystkie możliwe sposoby. co do Google API to zapoznam się z nim i dam znać.

: 18 grudnia 2009, 16:57
autor: jasiekmarc
Krótkie debugowanie doprowadziło mnie do wniosku, że nieco zbyt odważnie postępujesz ze stringami. Na przykład w linijce 73 (chyba) piszesz:

Kod: Zaznacz cały

wynik=wynik.substr(x,y-x);
nie sprawdzając wcześniej, czy y jest większe od x. Takich błędów jest więcej. Na przykład:

Kod: Zaznacz cały

liczba.replace(0,1," ");
bez sprawdzenia, czy

Kod: Zaznacz cały

liczba.length()
U mnie on się na nich wykrzaczał za każdym razem pokazawszy jednak jakieś wyniki.

: 20 grudnia 2009, 16:04
autor: bagsiur
W zasadzie masz rację, ale dla tego samego skryptu w php wszystko działa jak należy (najpierw pisałem to w php). Więc błędu chyba bede musiał poszukać w samym użyciu curl. Stringi nie mogłyby spowodować mojego błędu dlatego że dla tej samej podstrony, raz zwracają poprawny wynik a raz zrywa się połączenie. No nic, od jutra na poważnie biorę się za ten programik, (weekend nie pozwala pracować :) ) i o postępach dam znać :)

: 27 grudnia 2009, 22:25
autor: Marcinnn
Jeśli piszesz w PHP i lepiej znasz ten język to odnośnie programowania w C++ lub Javie, to trzymaj się tego co Ci napisał jasiekmarc, bo w PHP robi się dużo rzeczy, które w innych są po prostu niewybaczalnymi błędami.

: 28 grudnia 2009, 12:05
autor: bagsiur

Kod: Zaznacz cały

PHP robi się dużo rzeczy, które w innych są po prostu niewybaczalnymi błędami.
W takim razie nie znasz PHP a tym bardziej c++.

: 28 grudnia 2009, 12:18
autor: Marcinnn
Masz prawo do swojej oceny, ja mam prawo do swojej. :-)