2005 versie van de CD-Foongids (2)

Zoveel is duidelijk, voor de nieuwe CD-foon is een nieuwe versie van Foondump nodig. Moet je toch eerst die telefoonnummer-CD net zolang schudden totdat ie zijn geheimen prijsgeeft. Het wachten is op de nieuwe “Sleutelkoning” die dit even voor ons doet. Forumlezer van het type “Wilwelmaarkanniet”? Er is nog hoop! (ook voor “Kanwelmaarwilniet”)

Want er bestaat een wat minder bekende methode om toch gegevens uit een dergelijke ogenschijnlijk hermetisch gesloten databank te krijgen, nl. “schermschrapen”, een onofficiële vertaling van ‘screenscraping’, op zichzelf weer een term die op verschillende manieren gebruikt wordt.

Wat is schermschrapen? Hier even niet zoiets als ‘tempest’ of ‘van Eck-en’:

Evenmin het begrip [i]'Web- of HTML-scraping'[/i], meer verhullend wel [i]'Datamining'[/i] genoemd.

http://forums.virtualconspiracy.com/foondump/viewtopic.php?p=772#772][u]Vorige week[/u
al in het voorbijgaan aangestipt - aantrekkelijke methode, simpele middelen, snel resultaat, eenvoudig voorbeeld:

'speelfilms vanavond op Nederlandstalige tv-zenders ' Set ud = CreateObject("pocket.HTTP") 'www.pocketsoap.com/pocketHTTP With CreateObject("HtmlZap.HtmlZap") 'www.miken.com/htmlzap .CompressWS = True .LoadBuffer ud.GetResponse("http://www.tvgids.nl/films_ned.html", "").Bytes Do Until .EOF If .TagName = "h3" Then .Next: zender = Replace(.Text, "é", "é") If .Param("class") = "lijst_tijd" Then .Next: tijdstip = .Text If .Param("class") = "details_programma" Then .Next: titel = .Text wscript.echo tijdstip, zender, titel End If .Next Loop End With

Nee, hier gaat het om ‘screengrab of -capture’, dwz. hoe kan men de tekst in het scherm van een Windows-toepassing (de CD-foongids inbegrepen) met behulp van Windows-technieken omzetten naar een regulier tekstbestand. Iedereen kent wel de schermfoto die van je eigen scherm kan maken en het toepassen van OCR op ingescande (afbeeldingen van) tekst. Minder bekend zijn/is de methoden om niet-kopieerbare tekst op het beeldscherm daadwerkelijk weer ‘editable’ te krijgen en, sterker nog, dat zo’n applicatie eventueel ook nog “met-zonder-handen” bediend kan worden. Stel je dat zo voor, de stoel voor de PC is leeg maar op het scherm zie je de CD-foongids intensief geraadpleegd worden, de ene rubriek na de andere wordt ingevoerd, een onzichtbare gebruiker scrollt daarna steeds weer snel door de resultaten…

i[/i]

Hoe gaat zoiets in zijn werk? Er bestaat allerlei software om repeterende taken op de PC te automatiseren, een van die hulpmiddelen heet AutoIt en dat zou je als volgt kunnen inzetten om de CD-foongids van buiten-af te sturen:

[code]With CreateObject(“WScript.Shell”)
.Run “”“C:\Program Files\De Telefoongids\CD-foongids\dtgwin.exe”“”, 1
End With

With CreateObject(“AutoItX3.Control”) 'AutoIt Scripting Language - AutoIt
.AutoItSetOption “WinTitleMatchMode”, 4
.AutoItSetOption “WinSearchChildren”, 1
.AutoItSetOption “WinWaitDelay”, 10

cd = “CD-foongids”
.WinWaitActive cd, “”, 1000
.WinActivate cd, 250
.Send “!ZB”

rubrieken = array(“aannemersbedrijf”) 'dummy

sec = Timer

For each rubriek in rubrieken
.Send “{TAB}{TAB}” & rubriek & “{ENTER}”

cn = "classname=TPaintPanel"      
x = .WinGetPosX(cn, "")
y = .WinGetPosY(cn, "")
w = .WinGetPosWidth(cn, "")
h = .WinGetPosHeight(cn, "") - 200  'stuur geen bloemetje

ct = "classname=TVirtualStringTree"  'lijst aannemersbedrijven
For n = 1 To 13203                  'aantal in zoekresultaat
  'hier de gegevens uitlezen
  .WinActivate ct, ""
  .WinWait ct, "", 10
  .Send "{DOWN}"
  .WinWaitNotActive cn, "", 10
  .WinWait cn, "", 10
Next                                'regel

Next 'rubriek

MsgBox Timer - sec '2500 sec = 40 min

End With[/code]

i[/i]

In bovenstaande code zie je de ‘activex/dll’ van AutoIt vanuit “VBscript” bediend worden… Zal je zeggen: AutoIt-programmaatjes kunnen toch ook in het eigen scripttaaltje gemaakt worden, dat is zelfs nog iets compacter? Ja, maar op gegeven moment houdt het toch op met AutoIt. Bijvoorbeeld, de CD-foon toont het aantal gevonden aannemersbedrijven, 13203, in een schermonderdeel van het type ‘TPanel’. In het zoekprogramma van de CD-foon wordt dat type ‘control’ meer dan 1 keer ingezet en AutoIt kan alleen maar de eerste uit de rij aanspreken, en dat is net niet de ‘TPanel’ met het aantal gevonden aannemers.
Ook vanwege het uitlezen van de getoonde gegevens moet je dan noodgedwongen uitwijken naar een programmeertaal met meer mogelijkheden.

Hier niet maar in een echte versie zou de routine alle rubrieken doorlopen. Op dat moment is het opletten: van alle variaties op “aanneem” en “aannemer” omvat “aannemersbedrijf” zo te zien de meeste dochterrubrieken. Op de CD is te zien dat de rubrieken sporen met die in de lijst
http://www.telefoongids.nl/categories_a.html?][u]rubrieken[/u
op de website. Zelfs de specifieke webform-id voor “Aannemers” daar - “AAN15” - is op de CD terug te vinden. Maar dat is net NIET de term uit C-Contents ‘woordwiel’ die de meeste hits opleverde…

De opdracht: .Send “!ZB” is ALT-Z, “Zoeken” en vervolgens “B”, “Bedrijvengids”. Goed, Bedrijvengids, “roze” gaat wel lukken maar hier is het huiswerk voor “Wilwelmaarkanniet”: kraken, ok, dat even niet, maar kan jij wel een manier van opvragen verzinnen om ook alle “witte” vermeldingen volledig en zo efficiënt mogelijk te doorlopen?

Op de CD’s “Postcodeboek” (Welkom bij Postcodeboek Pro, PerfectView B.V.:
http://www.postcodeboekpro.nl/templates/mercury.asp?page_id=1587]bestellen
) en “Nationale telefoongids/Goudengids” (Welkom bij de Nationale telefoongids CD-Rom, een uitgave van Gouden Gids BV: [u]bestellen[/u) is het zoeken wel zo opgezet dat iemand vrij eenvoudig door alle plaatsen of regios kan stappen en dan zeker weet dat hij alle vermeldingen voorbij heeft zien komen.

i[/i]

AutoIt kan dus niet bij alle schermonderdelen komen, met oa. als gevolg dat het aantal gevonden vermeldingen niet in een programma-lus “uitlezen” gebruikt kan worden. Via de Windows-interface, de API, zijn er wel andere mogelijkheden om het bewuste schermonderdeel te identificeren, lastiger is het uitlezen van aantal en vervolgens de getoonde details van de vermelding. AutoIt heeft een simpele mogelijkheid om tekst van het scherm te lezen die bijvoorbeeld wel werkt in het Postcodeboek maar die het vervolgens bij de beide telefoongidsen prompt af laat weten. Een niet-gratis alternatief SnagIt “… the premier application to use for all of your screen capturing needs” werkt weer wel op de “Nationale telefoongids/Gouden Gids” (zij het nogal sloom) maar weer niet op de “CD-foongids”. Speurwerk leidde naar het onwaarschijnlijke Aqua Deskperience. In de kant-en-klaar-categorie lijkt die
http://www.deskperience.com][u]software[/u
voorlopig als enige in staat om het raampje met gidsvermeldingen van het CD-foongids-scherm uit te lezen. Probleem is hier dat het voor de ‘capture’ verantwoordelijke onderdeel, een DLL, niet zomaar in een eigen programma opgenomen kan worden.

Hier ligt dus een andere mogelijkheid om je als Forumlezer te onderscheiden: ontwikkel een routine, zeg maar een T-stuk, dat het afbeelden van gidsvermeldingen via de Windows-interface naar een eigen bestand om gaat leiden.