Kjapp og trygg hosting for Wordpress

Harvesting/scraping av SERP

adeneo

Medlem
Du skriver et script som kobler til en URL med søkeordet i (blant annet), faker en user agent, bruker en haug med proxier og timeouts for å ikke få opp Google's captcha eller bli utestengt, og hamrer i vei med tilfeldige timeouts da Google sjekker regelmessigheten for oppslag for å sjekke om det er en bot, samt en del andre triks, egentlig ikke særlig komplisert, og du kan kun scrape et visst antall sider for hvert søkeord.

Du kan i utgangspunktet hente hva som helst, men trikset er egentlig å se mest mulig ut som et menneske og ikke en robot, hvor bedre du gjør det, jo lenger tid tar det før proxiene dine blir sperret.
 

namaste

Medlem
Ah, jeg skal bare samle alle lenkene fra et site:nettside.tld resultat, ikke noe mer avansert enn det. Hvordan gjør jeg det?
 

adeneo

Medlem
Du ønsker bare å vite hvor mange resultater et domene får i Google ved 'site:' søk?

Det enkleste er vel å bruke cURL i PHP, men vær klar over at det tallet som kommer opp ikke nødvendigvis er helt nøyaktig, da Google i følge dem selv ikke oppgir nøyaktige tall ettersom det kan føre til at enkelte fører statistikk og finner nye måter å "game" systemet på.
Det gir uansett en slags pekepinn på hvor mange sider som er indeksert i Google, og det er vel ingen andre måter å finne ut akkurat det på.
Deler vanligvis ikke "scraping" scriptene mine, men akkurat dette er rimelig rett frem så får gjøre ett unntak ?
Måtte skrive om noen klasser til en litt enklere funksjon, men denne skulle hente det tallet du ønsker:

PHP:
function GoogleLinks($url) {
    $header[0]  = "Accept: text/xml,application/xml,application/xhtml+xml,";
    $header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
    $header[] = "Cache-Control: max-age=0";
    $header[] = "Connection: keep-alive";
    $header[] = "Keep-Alive: 300";
    $header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
    $header[] = "Accept-Language: nb-NO,nb;q=0.8,no;q=0.6,nn;q=0.4,en-US;q=0.2,en;q=0.2";
    $header[] = "Pragma: ";
    
    $G_url = 'http://www.google.com/search?hl=en&lr=&q=site:'.$url.'&btnG=Search';
    
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $G_url);
    curl_setopt($curl, CURLOPT_FAILONERROR,true);
    curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.77 Safari/535.7');
    curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
    curl_setopt($curl, CURLOPT_REFERER, 'http://www.google.com');
    curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
    curl_setopt($curl, CURLOPT_AUTOREFERER, false);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 2);
    $index = curl_exec($curl);
    curl_close($curl);
    
    if (isset($index)) {
        preg_match( '#<div id=resultStats>(.*?)<nobr>#si', $index, $indexed );
        if (isset($indexed[1])) {
            $indexed = preg_replace('/[^0-9\,]/', '', $indexed[1]);
        }else{
            $indexed = "Fant ingen linker i Google";
        }
    }else{
        $indexed = "Kunne ikke hente dette fra Google";
    }
    echo $indexed;
}

Brukes slik:

PHP:
GoogleLinks('dagbladet.no');
//eller
$minvariabel = GoogleLinks('minside.no');
//eller rett og slett 
echo GoogleLinks('vg.no');

Dette er uten SSL og proxier, faker Chrome sin User Agent og bruker Google som referer.
Det setter inn kommaer for hvert tredje tall, og det er en string, ikke integer, noe som er lett å endre på dersom det skulle være nødvendig.
Bruk det med andakt, og skulle du trenge SSL så kan du laste ned cacert.perm SSL sertifikat fra haxx (skal virke fint uten).
 
Sist redigert:

namaste

Medlem
Takk for raskt svar, men jeg var litt uklar. Det er et bestemt søk jeg ønsker å scrape/harveste resultatet fra... Site:engelsk-side.tld Ønsker å samle en bestemt type lenker fra det resultatet.
 

adeneo

Medlem
Poenget blir som over, bare å sette inn et fast domene i stedet og søke etter det bestemte resultatet med en regex eller lignende. Google har også en search API, men hvorvidt den fungerer til dette er vel usikkert, og den er vel ikke akkurat tiltenkt harvesting av resultater.
 

adeneo

Medlem
Det er nok ingen som "får lov", men Rand Fishkin (SEOmoz) tjener relativt mye spenn på dette, mens Scroogle er en gratistjeneste, og hvor mye man kan scrape kommer an på hvor mange IP adresser man klarer å generere, eller hvor mange proxier man klarer å finne, og SEOmoz har sannsynligvis noen milliarder gode grunner mer enn Scroogle til å fortsette å scrape.

I tillegg kommer selvfølgelig det problemet at Google stadig endrer litt på koden sin, noe som betyr at scraperen må skrives om, og en hel del andre ting som gjør det hele til litt jobb hvis man skal scrape mye.

Egentlig så er selve scrapingen rimelig rett frem, og forholdsvis enkelt, det som er problemet er at man rimelig fort støter på Google's captcha hvis man prøver å scrape mye, og hvis scriptet er automatisk og bare fortsetter å forsøke, så blir man svartelistet hos Google, noe som er kjipt hvis man kjører dette fra sin egen maskin hjemme og har fast IP.
Derfor trengs enten en eller annen form for generering av IP adresser, slik som Scroogle vel hadde, eller man må ha tilgang på et stort antall proxier, noe som ikke alltid er like lett uten å betale for det.

Jeg scraper Google akkurat nå, og det ser ikke ut som det er noen nye problemer?

Google er så i mot alle former for automatisert henting av data fra deres tjenester at de har vært så festlige at de har satt krypteringsnøkkelen som trengs for å hente ut PageRank til "Mining PageRank is AGAINST GOOGLE'S TERMS OF SERVICE. Yes, I'm talking to you, scammer.", genialt :D
 
Topp