Hányadik vagyok a Google-ben?

2013-04-24 09:09:01

Ha arra vagyunk kíváncsiak, hogy az általunk menedzselt vagy a konkurencia által üzemeltetett weboldal hányadik helyen szerepel bizonyos kulcsszavak tekintetében a Google keresőjében, induljunk ki először a kézi módszerből: rákeresünk. Megnyitjuk a legtöbbet használt böngészőnket, beírjuk a lokális google keresőbe (google.hu) a kifejezést, majd a találatokat átnézzük, lapozgatunk, esetleg számolgatunk. Ez mondjuk 1-2 kulcsszó és kis verseny esetében nem jelenthet nagy gondot, de mi történik, ha 10-20 kifejezésre kellene optimalizálnunk, folyamatosan figyelnünk?


Teljes bejegyzés

Alapszabályok

Először is legyünk tisztában azzal, hogy ha a legtöbbet használt böngészőben nyitjuk meg a google.hu-t, akkor az általában emlékezni fog a korábbi keresésekre és találatokra, illetve arra is, hogy melyikekre kattintottunk. Ebből adódóan a gyakran klikkelt találatokat egyre fontosabbnak fogja találni és idővel előrébb helyezi [*], ami torzíthatja az adatokat. Erre megoldás az inkognitó mód (a legtöbb böngészőben van erre lehetőség), lényege, hogy teljesen nulláról indul, tehát egy időre elfelejt minden olyan korábbi beállítást és szokást, amit a napi használat során rögzített. Én Google Chrome-ot használok, abban a Ctrl+Shift+N gombok megnyomásával nyílik egy új inkognitó böngészőablak. Az itt indított keresések sokkal közelebb lesznek az átlagfelhasználó kereséseihez, mint a sajátunk.

A folyamat

Írjuk be a keresőszót vagy kifejezést, ami számunkra fontos lehet, én példának a "seo mágia" kifejezést választottam. A Chromeban van egy fejlesztői konzol (F12 billentyűre jön elő), amiben követhetők a böngésző által lekért url-ek. A "Network" fülön egy adott url-re jobb gombbal kattintva van olyan lehetőség, hogy "Copy as curl", ami annyit tesz, hogy a vágólapra másol egy komplett cUrl lekérést, fejlécekkel együtt. Valami ilyesmi lesz az eredmény (a jobb láthatóság miatt tördeltem a sorokat)

curl "https://www.google.hu/search?q=seo+m%C3%A1gia&spell=1&sa=X&ei=en53Uau7JoSItQbH5YCICA&ved=0CCwQBSgA&biw=1920&bih=955" \
-H ":host: www.google.hu" \
-H "accept-charset: ISO-8859-2,utf-8;q=0.7,*;q=0.3" \
-H "accept-encoding: gzip,deflate,sdch" \
-H "accept-language: hu-HU,hu;q=0.8,en-US;q=0.6,en;q=0.4" \
-H "user-agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31" \
-H ":path: /search?q=seo+m%C3%A1gia&spell=1&sa=X&ei=en53Uau7JoSItQbH5YCICA&ved=0CCwQBSgA&biw=1920&bih=955" \
-H "accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" \
-H ":version: HTTP/1.1" \
-H "cache-control: max-age=0" \
-H "cookie: NID=67=xyxyxyxy; PREF=ID=xyxyx" \
-H ":scheme: https" \
-H ":method: GET"

Ez ebben a formában elég bő és vannak benne kifejezetten problémás sorok (NID és PREF-et tartalmazó sor), illetve az url-en is kell egy kicsit javítani, hogy a nem kívánt tényezők véletlenül se torzítsák az eredményt, arról nem is beszélve, hogy az eredmény tömörítve (gzip) érkezik a képernyőre, ami nem használható egyszerűen. Leegyszerűsítve és működőképesen jelenleg az alábbi cUrl parancssorral lehet megkapni az eredményt:

curl "https://www.google.hu/search?q=seo+mágia&start=0" \
-H "accept-charset: ISO-8859-2,utf-8;q=0.7,*;q=0.3" \
-H "accept-language: hu-HU,hu;q=0.8,en-US;q=0.6,en;q=0.4" \
-H "user-agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31" \
-H "accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" \
-H "cache-control: max-age=0" \
-o output.html

Az eredmény még így sem könnyen használható, egy uglifyolt html-t kapunk, amiből még greppel/seddel/awkval sem egyszerű kinyerni a lényeget. Kis nyomozás után kiderül, hogy egy "search" id-jű div-ben vannak a valódi találatok (szponzorált linkek ugye nem számítanak), abban is van egy "rso" id-jű számozott lista, ami felsorolja őket. Kicsit mélyebbre mászva láthatjuk, hogy az összes találat hivatkozása egy "l" osztályú link (anchor, a), mondjuk jQuery-ben így lehet rájuk hivatkozni: $('a.l')  

Feldolgozás

A HTML fájlban a nekünk érdekes részt a DOM fa bejárásával találhatjuk meg, de erre már vannak eszközök, amik ezt biztosítják. Én a phpQuery-t választottam. Nem túl gyors, de képes egyszerűen elénk tárni az eredményt.

require('phpQuery.php');

$doc = phpQuery::newDocument(file_get_contents('output.html'));
$r = $doc['a.l'];
foreach ($r as $row) {
    printf("%s\n", pq($row)->attr('href'));
}

Ez a script felsorolja a találatok URL-jeit. Minden eszköz meg van arra, hogy ebből egy automatizált helyezés-ellenőrző legyen. Címszavakban: nyilván tartjuk a kifejezéseket (phrases.txt), nyilván tartjuk a domaineket (domains.txt), majd a kettőből egy mátrixot készítünk, amit már akár excelben is tudunk értelmezni, osztályozni, jelenteni.

Összelegózva

A csomag tartalma tehát:

  • check.sh - fő belépési pont, ez futtatja az összes kapcsolódó scriptet
  • parse.php - feldolgozza az egyes találati oldalakat és felsorolja az url-eket, amiket talált benne
  • format.php - az eredményt megformázza tsv formátumban a későbbi kezelhetőséghez
  • domains.txt - figyelendő domain-ek listája
  • phrases.txt - keresendő kifejezések listája
  • output.html - munkafájl, törlődik
  • temp-*.txt - munkafájlok, törlődnek

A fájlokat feltöltöttem githubra: https://github.com/deejayy/google-position-check

Eredmény

 

Pontszám: a kisebb jobb


Windows Event Log bedolgozás MSSQL adatbázisba

2007-04-30 21:06:33
Címkék: windows , script , mssql , event log

Több szerver esetén az eseménynaplókat igencsak nehéz követni. Ráadásul lehetnek olyan alkalmazások, amik teleszemetelik a logot normális működés esetén is. A Windows beépített "Event Viewer-e (eventvwr.msc)" igencsak kevés szűrési lehetőséget kínál, igény lehet esetleg valamilyen kúltúrált módon feldolgozni a naplóban lévő adatokat, bejegyzéseket. Az alább található scriptek segítenek az eseménynapló könnyebb szűrésében olyan módon, hogy egy MSSQL adatbázisba teszik az utolsó gyűjtés óta keletkezett bejegyzéseket, onnan pedig könnyen olvasható módon, tetszőleges feltételekkel szűrve le lehet kérdezni.


Teljes bejegyzés

Tábladefiníció (MSSQL-hez)

CREATE TABLE [dbo].[events] (
[EventID] [int] IDENTITY (1, 1) NOT NULL ,
[RecordNumber] [int] NULL ,
[Category] [int] NULL ,
[CategoryString] [varchar] (255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[ComputerName] [varchar] (255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[EventCode] [int] NULL ,
[EventType] [int] NULL ,
[LogFile] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[Message] [text] COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[SourceName] [varchar] (255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[TimeGenerated] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[Type] [varchar] (255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[UserName] [varchar] (255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[TimeWritten] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
)
GO

 CREATE  CLUSTERED  INDEX [IX_CL_Written] ON [dbo].[events]([TimeWritten]) WITH  FILLFACTOR = 90
GO

 CREATE  UNIQUE  INDEX [IX_Events01] ON [dbo].[events]([EventID]) WITH  FILLFACTOR = 90
GO

A gyűjtő script, visual basicben (evtosql.vbs)

Option Explicit
Dim objWMI, colLoggedEvents, strComputer, objItem, cnames, conn, cmd, rs, lasttime

cnames = Array("MSSQLDB01", "MSSQLDB02")

set conn = CreateObject("ADODB.Connection")
set cmd = CreateObject("ADODB.Command")
set rs = CreateObject("ADODB.RecordSet")
conn.Open "DRIVER={SQL Server};SERVER=mssql_szerver;DATABASE=teszt;UID=teszt;PWD=teszt"
set cmd.ActiveConnection = conn

For Each strComputer In cnames

  rs.Open "select ISNULL(MAX(TimeWritten), '2007') as TimeWritten from events where ComputerName = '" & strComputer & "'", conn
  lasttime = rs("TimeWritten")
  rs.Close

  set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
  set colLoggedEvents = objWMI.ExecQuery("Select * from Win32_NTLogEvent where TimeWritten > '" & lasttime & "' and LogFile != 'Security'")

  WScript.Echo "Processing: " & strComputer
  For Each objItem in colLoggedEvents
      cmd.CommandText = "insert into events (RecordNumber, Category, CategoryString, ComputerName, EventCode, EventType, LogFile, Message, SourceName, TimeGenerated, Type, TimeWritten, UserName) values (" & _
      "" & objItem.RecordNumber & ", " & _
      "" & objItem.Category & ", " & _
      "'" & objItem.CategoryString & "', " & _
      "'" & objItem.ComputerName & "', " & _
      "" & objItem.EventCode & ", " & _
      "" & objItem.EventType & ", " & _
      "'" & objItem.LogFile & "', " & _
      "'" & Replace(objItem.Message & " ", "'", """") & "', " & _
      "'" & objItem.SourceName & "', " & _
      "'" & objItem.TimeGenerated & "', " & _
      "'" & objItem.Type & "', " & _
      "'" & objItem.TimeWritten & "', " & _
      "'" & objItem.User & "')"
      cmd.Execute
  Next
  WScript.Echo "Done: " & strComputer

Next

WSCript.Quit

Egy kellemes kis lekérdezés, amit tetszőlegesen lehet szűrni az értékes információért (events.sql)

print ''
print ''
print '~~~~~~~~~'
print 'Esemenyek'
print '~~~~~~~~~'
print ''
declare @day int
set @day = 3
select  SubString(TimeWritten, 1, 4) + '-' + SubString(TimeWritten, 5, 2) + '-' +
        SubString(TimeWritten, 7, 2) + ' ' + SubString(TimeWritten, 9, 2) + ':' +
        SubString(TimeWritten, 11, 2) + ':' + SubString(TimeWritten, 13, 2) [TimeWritten]
       ,SubString(ComputerName, 1, 15) [ComputerName]
       ,SubString(LogFile, 1, 3) [Log]
       ,SubString(SourceName, 1, 20) [SourceName]
       ,SubString(Type, 1, 1) [Type]
       ,SubString(Replace(SubString(Message, 1, 512), char(13)+char(10), ''), 1, 60) [Message]
  from teszt.dbo.events
 where EventType != 3
   and SourceName not in ('W32Time', 'Print')
   and TimeWritten > (Cast(DatePart(yyyy, GetDate()-@day) as varchar(4))
       +CASE
         WHEN DatePart(mm, GetDate()-@day)<10
         THEN '0'+Cast(DatePart(mm, GetDate()-@day) as varchar(4))
         ELSE Cast(DatePart(mm, GetDate()-@day) as varchar(4))
        END
       +CASE
         WHEN DatePart(dd, GetDate()-@day)<10
         THEN '0'+Cast(DatePart(dd, GetDate()-@day) as varchar(4))
         ELSE Cast(DatePart(dd, GetDate()-@day) as varchar(4))
        END)
 order by TimeWritten desc

Egy batch fájl, ami mindent elintéz (evsql.bat)

@echo off
cscript evtosql.vbs
osql -E -s "|" -w 146 -S MSSQL_SZERVER -i events.sql | findstr /v "affec" | findstr /v ">"
echo Vege
pause > nul

Windows Event Log bedolgozás MSSQL adatbázisba [update 1]

2015-04-30 22:23:52
Címkék: windows , script , mssql , event log

Korábbi leírás alapján kicsit módosított scriptek.

Tábladefiníció (MSSQL 2012-höz)


Teljes bejegyzés
CREATE TABLE [dbo].[events](
    [EventID] [int] IDENTITY(1,1) NOT NULL,
    [RecordNumber] [int] NULL,
    [Category] [int] NULL,
    [CategoryString] [varchar](255) NULL,
    [ComputerName] [varchar](255) NULL,
    [EventCode] [int] NULL,
    [EventType] [int] NULL,
    [LogFile] [varchar](32) NULL,
    [Message] [text] NULL,
    [SourceName] [varchar](255) NULL,
    [TimeGenerated] [datetime] NULL,
    [Type] [varchar](255) NULL,
    [UserName] [varchar](255) NULL,
    [TimeWritten] [datetime] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY];

A gyűjtő script, visual basicben (transfer.vbs)

Option Explicit
Dim objWMI, wbtTimeWritten, wbtTimeGenerated, colLoggedEvents, strComputer, objItem, cnames, conn, cmd, rs, lasttime, dtmRegular

cnames = Array( _
    "SQL-01", _
    "SQL-02" _
)

set wbtTimeWritten = CreateObject("WbemScripting.SWbemDateTime")
set wbtTimeGenerated = CreateObject("WbemScripting.SWbemDateTime")
set conn = CreateObject("ADODB.Connection")
set cmd  = CreateObject("ADODB.Command")
set rs   = CreateObject("ADODB.RecordSet")

conn.Provider                                = "sqloledb"
conn.Properties("Data Source").Value         = "SQL-02\SQLINSTANCE"
conn.Properties("Initial Catalog").Value     = "Management"
conn.Properties("Integrated Security").Value = "SSPI"
conn.Open

set cmd.ActiveConnection = conn

For Each strComputer In cnames
    rs.Open "select ISNULL(MAX(TimeWritten), '2007-01-01') as TimeWritten from events where ComputerName = '" & strComputer & "'", conn
    wbtTimeWritten.SetVarDate rs("TimeWritten"), true
    WScript.Stdout.write "Last: " & strComputer & " / " & wbtTimeWritten.value
    rs.Close

    set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    set colLoggedEvents = objWMI.ExecQuery("Select * from Win32_NTLogEvent where TimeWritten > '" & wbtTimeWritten.Value & "' and LogFile != 'Security'")

    WScript.Stdout.write " " & colLoggedEvents.count & " rows"
    For Each objItem in colLoggedEvents
        wbtTimeWritten.Value = objItem.TimeWritten
        wbtTimeGenerated.Value = objItem.TimeGenerated

        dtmRegular = wbtTimeWritten.GetVarDate(false)
        dtmRegular = DateAdd("h", 2, dtmRegular)
        wbtTimeWritten.SetVarDate dtmRegular, false

        dtmRegular = wbtTimeGenerated.GetVarDate(false)
        dtmRegular = DateAdd("h", 2, dtmRegular)
        wbtTimeGenerated.SetVarDate dtmRegular, false

        cmd.CommandText = "insert into events (RecordNumber, Category, CategoryString, ComputerName, EventCode, EventType, LogFile, Message, SourceName, TimeGenerated, Type, TimeWritten, UserName) values (" & _
        "" & objItem.RecordNumber & ", " & _
        "" & objItem.Category & ", " & _
        "'" & objItem.CategoryString & "', " & _
        "'" & strComputer & "', " & _
        "" & objItem.EventCode & ", " & _
        "" & objItem.EventType & ", " & _
        "'" & objItem.LogFile & "', " & _
        "'" & Replace(objItem.Message & " ", "'", """") & "', " & _
        "'" & objItem.SourceName & "', " & _
        "'" & wbtTimeGenerated.Year & "-" & wbtTimeGenerated.Month & "-" & wbtTimeGenerated.Day & " " & wbtTimeGenerated.Hours & ":" & wbtTimeGenerated.Minutes & ":" & wbtTimeGenerated.Seconds & "', " & _
        "'" & objItem.Type & "', " & _
        "'" & wbtTimeWritten.Year & "-" & wbtTimeWritten.Month & "-" & wbtTimeWritten.Day & " " & wbtTimeWritten.Hours & ":" & wbtTimeWritten.Minutes & ":" & wbtTimeWritten.Seconds & "', " & _
        "'" & objItem.User & "')"
        cmd.Execute
    Next
    WScript.Echo " done."
Next

WSCript.Quit

Egy kellemes kis lekérdezés, amit tetszőlegesen lehet szűrni az értékes információért (events.sql)

print ''
print ''
print '~~~~~~~~~'
print 'Esemenyek'
print '~~~~~~~~~'
print ''
declare @day int
set @day = 7
select [TimeWritten]
       ,SubString(ComputerName, 1, 15) [ComputerName]
       ,SubString(LogFile, 1, 3) [Log]
       ,SubString(SourceName, 1, 20) [SourceName]
       ,SubString(Type, 1, 1) [Type]
       ,SubString(Replace(SubString(Message, 1, 512), char(13)+char(10), ''), 1, 120) [Message]
  from Mgmt.dbo.events
 where EventType != 3
   and SourceName not in ('W32Time', 'Print')
   and TimeWritten > CURRENT_TIMESTAMP-@day
 order by TimeWritten desc

Egy batch fájl, ami mindent elintéz (evsql.bat)

@echo off
cscript transfer.vbs
osql -E -s "|" -w 206 -S SQL-02\SQLINSTANCE -i events.sql | findstr /v "affec" | findstr /v ">" | less
pause

Olcsó asztali órás rádió Androidból

2017-04-14 22:36:00
14

Konzol kimenet színezés

2017-01-06 13:08:37
0

Windows Event Log bedolgozás MSSQL adatbázisba [update 1]

2015-04-30 22:23:52
0

Az internetadó margójára

2014-11-01 10:39:57
0

A C4nn0N logó

2014-07-26 20:50:32
0

Virtualizálás Xen 4.4-gyel Ubuntu 14.04 alatt (64 bit)

2014-04-30 09:46:38
1

Xen és XenServer előadás

2014-04-17 06:11:00
0

HLDS-V8: Javascripttel programozható HLDS (CS 1.6)

2014-03-15 09:33:53
0

Node.js lazy hibakezelés

2013-08-19 22:08:35
0

Office 2013 animáció kikapcsolása

2013-07-02 08:31:35
1

Node.js ékezetes szövegbevitel konzolból / parancssorból

2013-06-27 07:41:54
0

Egy Counter Strike szerver üzemeltetési tapasztalatai

2013-05-17 14:21:14
7

Hogyan tegyünk grafikus felületet Ubuntu 10.04 Serverre?

2013-05-07 08:19:05
2

Torrent tracker node.js-ben 65 sorban

2013-04-28 10:23:25
0

Hányadik vagyok a Google-ben?

2013-04-24 09:09:01
0

Virtualizálás Xen 4.1-gyel Ubuntu 12.04 alatt (64 bit)

2013-01-22 08:58:15
2

Cloud Backup - Ments a felhőbe

2012-05-02 21:46:13
0

VIP plugin CS 1.6-hoz

2012-04-22 16:35:07
7

Ki az az admin?

2012-03-17 23:45:04
0

Csináltam egy blogot

2011-12-09 15:32:11
2

Az IT szabályozásokról

2009-09-01 17:30:58
0

Twitter - IRC gateway, avagy hogyan twitteljünk irc protokollon

2009-06-05 09:51:47
0

Hogyan lehet blokkolhatatlan hirdetéseket elhelyezni egy weblapon?

2008-10-28 10:56:30
11

Virtualizálás Xen-nel Ubuntu 8.04.1 Server-en

2008-09-04 18:46:02
0

Hogyan tegyünk grafikus felületet Ubuntu 8.04 Serverre?

2008-05-19 20:02:29
0

FAR Manager kedvcsináló I.

2008-05-02 11:41:02
0

Far Manager 1.80 - Open Source

2008-01-04 21:11:19
0

IBM DB2 9.5 Express install Ubuntu 7.10 Serverre

2007-12-19 10:35:03
0

IBM Websphere Application Server 6.1.0.3 Express és WAS Plugin install Ubuntu 7.10 Serverre

2007-12-19 10:33:27
0

Hogyan tegyünk grafikus felületet Ubuntu 7.10 Serverre?

2007-12-11 22:00:17
0

Warezolás, gazemberség?

2007-11-20 21:01:00
0

iSCSI Target és Initiator installálása Ubuntu 6.06.1 LTS-re

2007-10-13 18:23:40
0

Oracle 11g R1 install Ubuntu 6.06.1-re

2007-08-18 14:13:04
0

How to install Oracle 11g R1 on Ubuntu 6.06.1 LTS

2007-08-18 14:13:04
0

Hogyan tegyünk grafikus felületet Ubuntu 6.06.1 Serverre?

2007-08-18 14:09:55
0

Apache2 - WebDAV - Ubuntu 6.06.1 - Windows XP kliens

2007-08-13 19:48:34
0

CVS beállítása Ubuntu 6.06.1-re

2007-05-21 19:39:32
0

IBM DB2 8.2 Express install Debian 4.0-ra (64 bit)

2007-05-15 20:21:33
0

IBM DB2 8.2 Express install Ubuntu 6.06.1-re

2007-05-09 20:47:34
0

Lemez olvasási/írási sebesség tesztelés linux alatt

2007-05-05 20:14:30
0

Oracle Applications tippek 1.

2007-05-03 20:47:55
0

Windows Event Log bedolgozás MSSQL adatbázisba

2007-04-30 21:06:33
0

Oracle tippek 1.

2007-04-30 17:20:25
0

MySQL automatikus backup készítés jelszó felfedése nélkül

2007-04-18 23:42:51
0

LVM - logikai lemezkezelés (skicc)

2007-04-15 19:28:33
0

Counter Strike 1.6 telepítése Ubuntu 6.06.1-re

2007-04-08 12:15:32
0