[PHP] Parsanje googlovih rezultatov
9 naročnikov
9 naročnikov
Sem probal za hec sparsati googlove rezultate. Vendar se je kaj hitro ustavilo. IZvorna koda je zakodirana z javascriptom, kako se da to najlažje rešit, da dobiš čisti HTML? Hvala za pomoč.
12 odgovorov
Free quota
Usage is free for all users, up to 100 queries per day.
zadeva je precej omejena, in sicer free varianta 100 querijev na dan.
predvsem za seo analizo ključnih besed in njihovih pozicij... je lahko 100 querijev hitro mimo... ali obstajajo kakšne alternative?
To je proti google TOS-u in je zato precej zaj...
Jaz "bi" tako naredil... v settingsih shraniš/nastaviš instant search na off in prikaz rezultatov na 100. potem pa parsaš rezultate searcha z enim regexom pa je. osebno bi me zanimalo, če je stran za določen kw pod 100 mestom, kar je več je itak brezveze.
Seveda bi za vse uporabljal level 1 proxye, ki niso public.
Rezultati api-ja pa baje niso čisto taki, kot so v searchu.
Jaz sem si že kar dolgo nazaj za lastne potrebe napisal nek program, da grem za vse moje ključne besede avtomatsko po google iskalniku. Pri tem sparsam običajni html, ki ga dobim preko http get. Včasih je bilo dovolj, da sem dodal cca 2s pavze med poizvedbami in sem lahko izvedel vseh 2000 izvedb (2 strani po 100 zadetkov za 1000 ključnih besed) v enem šusu.
Nekje pol leta nazaj pa so to poostrili in so nekje po 120 zadetkih začeli vračati nek error rezultat in takšno error stanje traja cca 20 minut (na pamet rečeno), potem pa spet začne delovati. Začasno sem potem to rešil tako, da naredim samo 120 poizvedb in niti ne pridem do error stanja. Potem pa sam sprožim šele čez nekaj časa naslednjih 120 poizvedb, da počasi pridem do mojih 1000 besed, ki jih opazujem.
Je pa zanimivo, da takrat, ko ta avtomatski search neha delovati, lepo deluje ročno iskanje po googlu iz browserja. Nisem se še spravil, da bi točno videl kaj takrat primerjajo, ko ugotovijo, da gre za avtomatizem, ker očitno ni vezano na IP, ampak na določena polja v okviru http get zahtev, ker drugače ročno iskanje tudi ne bi delalo, če bi google začasno banal moj ip.
problem se pojavi pri parsanju HTML kode, ki je zakodirana.
poglejte tukaj: http://www.shrani.si/f/J/Oo/3BqN3PGi/aa.png
kako rešiti takšno zadevo? Hvala za pomoč!
Jaz pozicije iščem takole:
s http get zahtevo na google, kjer se doda parameter za ustrezno frazo, ki me zanima, dobim kompleten html
Nato piščem v kodi: <h3 class="r">. To se nahaja pred vsakim zadetkom, se pravi domeno, npr. <h3 class="r"><a href="http://xyz"
Po vrsti iščem te zgornje fraze toliko časa, da pridem do moje domene. S tem, ko vem kolikokrat sem najdel <h3 class="r">, vem tudi pozicijo, kje se nahaja moja domena.
Vse te točke ponovim za vsako ključno besedo, ki jo imam v mysql že tako ali tako zaradi strani.
Zdaj, če je kakšen del strani "kodiran" me niti ne zanima, ker iščem samo to kar sem napisal in se v druge elemente strani ne poglabljam.
Vem pa da so cca pol leta nazaj nekaj spremenili in je ta <h3 class="r"> prej bil malo drugačen, kar je sicer takrat pomenilo, da mi ni nič najdlo, a to sem hitro popravil. ;)
Uporabi Simple HTML DOM parser.
Jaz resim zadevo takole
$html = file_get_html('http://www.google.com/search?q='.urlencode($keyword));
$i=0;
foreach($html->find('a[class=l]') as $element)
{
$i++;
$link = $element->href;
}
Jaz sem v delphiju pisal, ker imam še druge stvari v okviru tega programa in sem za osnovo uporabil tisto, kar sem zgoraj pisal. Se pa strinjam, da je tako še veliko lepše.
en frend je izvajal parsing JS strani, tako da je pognal instanco browserja (se mi zdi da je nucu chrome), kjer se je izvedla koda..nato pa je parsal tisto stran (html)...
Pred kratkim sem naredil google scrap v ruby-ju, cca. 5 minut mi je vzelo, da sem copy&pastal iz weba primere in jih priredil za moje potrebe.
Tkole zgleda ta ruby koda:
require 'rubygems'
require 'open-uri'
require 'nokogiri'
kw = "huda bejba"
url = "http://www.google.com/search?q=#{CGI.escape(kw)}"
d = Nokogiri::HTML(open(url))
links = []
d.xpath('//cite').each {|x| links.push x.text }
V arrayu links[] imas linke na prvi strani za iskan KW, pa se po pozicijah so postavljeni v arraj tako da je links[0] prvi link, links[1] je drugi,...
Ce PHP ni ravno pogoj... ;)