C++ i curl problem z konsekwencj

Potrzebujesz pomocy z C, C++, perl, python, itp.
Awatar użytkownika
bagsiur
Beginner
Posty: 132
Rejestracja: 01 czerwca 2008, 22:12
Lokalizacja: Będzin

C++ i curl problem z konsekwencją programu.

Post 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...
Awatar użytkownika
jasiekmarc
Posty: 88
Rejestracja: 27 września 2009, 20:05
Lokalizacja: Wrocław

Post 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.
Awatar użytkownika
bagsiur
Beginner
Posty: 132
Rejestracja: 01 czerwca 2008, 22:12
Lokalizacja: Będzin

Post 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ć.
Awatar użytkownika
jasiekmarc
Posty: 88
Rejestracja: 27 września 2009, 20:05
Lokalizacja: Wrocław

Post 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.
Awatar użytkownika
bagsiur
Beginner
Posty: 132
Rejestracja: 01 czerwca 2008, 22:12
Lokalizacja: Będzin

Post 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ć :)
Marcinnn
Posty: 86
Rejestracja: 26 grudnia 2007, 07:08

Post 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.
Awatar użytkownika
bagsiur
Beginner
Posty: 132
Rejestracja: 01 czerwca 2008, 22:12
Lokalizacja: Będzin

Post 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++.
Marcinnn
Posty: 86
Rejestracja: 26 grudnia 2007, 07:08

Post autor: Marcinnn »

Masz prawo do swojej oceny, ja mam prawo do swojej. :-)
ODPOWIEDZ