Skrypt sprawdzający pozycję w wyszukiwarce. SERP checking script
12 czerwca, 2013 1 komentarz
Po bardzo długiej przerwie wracam do bloga.
W mojej nowej pracy jednym z problemów jakimi się zajmuje jest monitorowanie pozycji kilku stron na wybrane słowa kluczowe. Z natury jestem „leniwy” dlatego starałem się ten proces jakoś zautomatyzować. Jest kilka stron (seomoz, sitemapdoc, whatsmyserp, nextserp, seoserp), które pozwalają na kontrolę pozycji (sam używałem 3 pierwszych) ale nie spełniały moich oczekiwań. Najczęściej aby móc sprawdzić kilka stron albo kilka słów kluczowych należy wykupić płatną wersje takiego serwisu (seomoz 99$ miesięcznie). Czasem po prostu uciążliwe jest wpisywanie za każdym razem inny adres albo po prosu są niedokładne. Postanowiłem poszukać jakiegoś skryptu, który ułatwiłby mi sprawdzanie pozycji. Sądziłem, że znalezienie czegoś takiego będzie bardzo proste, w końcu samo zagadnienie jest popularne a napisanie czegoś takiego nie powinno być trudne. Niestety. Okazało się, ze nie mogę znaleźć nic co by mnie satysfakcjonowało. Dlatego cytując siebie „…a napisanie czegoś takiego nie powinno być trudne” wpadłem na pomysł aby samemu napisać taki skrypt. Z racji stanowiska/oprogramowania jakiego używam w rachubę wchodził w zasadzie tylko Visual Basic Script.
Od razu zastrzegam był to pierwszy skrypt napisany w VBS jednocześnie wersja zamieszczona tutaj jest wersją deep pre alfa 0.03. Obecna wersja, mocno rozbudowana, sczytuje słowa kluczowe z pliku, zapisuje łądnie wszystko do Excela, tworzy wykresik. Jednocześnie posiada mechanizm ułatwiający rozwiązywanie captcha. Skrypt pozwala na szybką zmianę języka wyszukiwarki, jest uporządkowany w funkcje/procedury i ma kilka innych bajerów. Ostatecznej wersji nie mogę, i nie chcę, opublikować gdyż jest używana w firmie.
Cały listing:
' The script is provideed "as is" ' Usage: script_name keyword no_of_pages ' Author Tomasz Radomski Option Explicit Dim args args = WScript.Arguments.Count if args <> 2 then Wscript.Echo "SERP.vbs Keyword MaxSearchPage" wscript.Quit end if Dim objIE : Set objIE = CreateObject("InternetExplorer.Application") Dim j, boolZnalazlem boolZnalazlem = False Function Adres(a) Adres="http://www.google.com/search?hl=en&q="& WScript.Arguments.Item(0) & "&start=" & a End Function 'GLOWNA FUNKCJA ODPOWIEDIALNA ZA SZUKANIE STRONY W WYNIKACH Function Szukaj() IF NOT(boolZnalazlem) Then ' otwiera strone googla objIE.Visible = true objIE.Navigate Adres(j*10) Do Until objIE.ReadyState = 4 WScript.Sleep 500 Loop 'ustawia szukany url Dim RegExp : Set RegExp=CreateObject("VBScript.RegExp") RegExp.Pattern="www.exmaple.com" Dim objResult, i, intPozycja 'WYBRANIE WYNIKOW PO TAGU <H3> Set objResult = objIE.document.getElementsByTagName("h3") intPozycja=0 For i=0 to objResult.length-1 'SZUKANIE W WYNIKACH If (objResult(i).getAttribute("class")="r") then intPozycja=intPozycja+1 If RegExp.Test(objResult(i).innerHTML) Then boolZnalazlem=True MsgBox "Strona " & objResult(i).innerText & vbCr & "Adres " & objResult(i).getElementsByTagName("a")(0).href & vbCr & "jest na pozycji " & j*10 + intPozycja Exit for End If End if Next End If Set objResult = Nothing End Function 'GLOWNA CZESC PROGRAMU For j=0 to WScript.Arguments.Item(1)-1 Szukaj Next MsgBox "Skonczylem" objIE.Quit
Trochę opisu aby wiadomo było co się tam dzieje
objIE.Visible = true objIE.Navigate Adres(j*10) Do Until objIE.ReadyState = 4 WScript.Sleep 500 Loop
Otwiera kolejną stronę wyszukania. Zmieniając parametr objIE.Visible na False nie będzie pojawiało się okno IE.
W poniższym fragmencie ustawiamy jakiej domeny/adresu szukamy. Wyrażenie regularne sprawdzi nam później czy taka domena znajduje się w wynikach
Dim RegExp : Set RegExp=CreateObject("VBScript.RegExp") RegExp.Pattern="www.exmaple.com"
Teraz najważniejszy fragment kodu, parser wyników wyszukiwarki. Zrobiony na około ale najważniejsze, że działa.
'WYBRANIE WYNIKOW PO TAGU <H3> objResult = objIE.document.getElementsByTagName("h3") intPozycja=0 For i=0 to objResult.length-1 'SZUKANIE W WYNIKACH IF (objResult(i).getAttribute("class")="r") then intPozycja=intPozycja+1 If RegExp.Test(objResult(i).innerHTML) Then boolZnalazlem=True MsgBox "Strona " & objResult(i).innerText & vbCr & "Adres " & objResult(i).getElementsByTagName("a")(0).href & vbCr & "jest na pozycji " & j*10 + intPozycja Exit for End If End if Next
Wybieram elementy strony po tagu H3, tak tagowane są wyniki jakie wypluwa Google. Następnie dla każdego z tych wyników sprawdzam jego klasę. Aby pominąć wyniki z adword, obrazków, map i tym podobnych klasa powinna być ustawiona na „r„. Jeżeli w tak wybranym elemencie znajduje się szukany tekst (w tym przypadku http://www.example.com) skrypt informuje nas o tym wypisując odpowiednią formułkę: „Strona <nazwa strony> Adres: <adres> jest na pozycji <pozycja>” Ustawiana jest zmienna boolZnalazlem i skrypt przestaje dalej szukać.
Jak wspomniałem jest to wczesna wersja tego skryptu obecnie jest troszkę poprawiona i zawiera kilka nowych funkcji. Jeżeli ktoś zacząłby go używać i poprawił proszę o informacje czy mój skrypt okazał się pomocny. Programistycznie na pewno nie jest to arcydzieło np powinienem raczej użyć obiektu MSXML2.ServerXMLHTTP.6.0 zamiast InternetExplorer.Application ale nijak nie mogłem zmusić funkcji szukającej do pracy z drzewem DOM tak stworzonego dokumentu. Wszyscy profesjonalni programiści śmiało mogą wytykać błędy.
Pozdrawiam
Pingback: Javascript i wysyłanie POST „w locie” | Radom blog