Het downloadprogramma ‘Archipol.cgi’

Het project Archipol heeft tot doel een archief op te zetten van (versies van) websites van Nederlandse politieke partijen. Hiertoe worden websites periodiek gedownload en weggeschreven naar de eigen Archipol-server. Vervolgens worden de sites geanalyseerd, gearchiveerd en ontsloten voor later gebruik.

Archipol.cgi is de naam van het programma dat is ontwikkeld voor het downloaden van een gehele of gedeeltelijke Internet-site. Het programma is een eerste aanzet en bedoeld om samen te werken met een archiverings-programma en een eigen webserver. De webserver dient er zorg voor te dragen dat de links in de html-pagina's worden vertaald naar lokale links.

Archipol.cgi werkt met gegevens uit het file "archipol.ini". In deze file staat o.a. welke site moet worden gedownload en waar de files lokaal moeten worden opgeslagen. De namen in "archipol.ini" komen overeen met namen van variabelen in archipol.cgi, en worden in het programma alleen door '$g_' voorafgegaan. Zo wordt de waarde van bijvoorbeeld "debug" toegekend aan de variabele "$g_debug". Deze methode lijkt omslachtig maar voorkomt dat door type-fouten variabelen ontstaan waarvan achteraf met moeite de foutoorzaak kan worden gevonden.

In "archipol.ini" horen de volgende waarden te staan:

Debug Off=0 en On=1 Met debug=1 wordt extra veel output tijdens de download gegenereerd. Mogelijke fouten worden zo eenvoudiger onderkend.
html Off=0 en On=1 Met html=1 wordt de uitvoer van het programma als html-code verpakt en kan het programma als zodanig als cgi-script gestart worden.
search_engine_name Dit is de naam van het programma zoals dat aan de te onderzoeken site wordt doorgegeven.
email Tijdens de zoekaktie wordt het e-mailadres aan de te onderzoeken site doorgegeven.
root Dit is de root van de te onderzoeken site. De waarde mag subdirectories bevatten. Files hoger in het path worden niet gedownload.
De variabele mag geen file-naam bevatten.
Voorbeelden: 'http://www.ub.rug.nl/' of  'http://www.bibliothek.uni-regensburg.de/ezeit/'
first_files Indien niet van de default-file gebruik wordt gemaakt dient de variabele een of meer file-namen te bevatten. Het ';'-teken dient als onderscheidingsteken.
Met default-file wordt de file bedoeld die de webserver standaard stuurt als de URL alleen een path bevat, bijv:
'http://www.ub.rug.nl/'
en niet
'http://www.ub.rug.nl/index.html'
save_files_in De waarde hiervan geeft de path waar de files worden opgeslagen
how_deep_will_we_go De waarde geeft de maximale diepte in aantallen subdirectories van de te downloaden files. Dit voorkomt dat foutieve links kunnen leiden tot een oneindig aantal subdirectories
filename_for_no_filename Indien een link geen file-naam bevat maar bijv. alleen bestaat uit een path van directories dan wordt aan deze file deze naam gegeven
do_not_search_extensions Files met extensies die in deze lijst voorkomen worden niet onderzocht op links.
Het onderscheidingsteken is ';'
do_not_download_extensions Files met extensies die in deze lijst voorkomen worden niet gedownload.
Het onderscheidingsteken is ';'
not_allowed_tags Tags met namen zoals in deze lijst worden niet op links onderzocht.
Het onderscheidingsteken is ';'
max_file_size Files groter dan hier aangegeven worden niet gedownload.
Een 'K' wordt vervangen door '000' en een 'M' door '000000'
max_filename_size Files met namen die meer tekens bevatten dan deze waarde worden niet gedownload.
Dit voorkomt dat een foutieve link kan leiden tot file-namen van oneindige lengte
search_tags Dit is een lijst van combinaties van tags en de naam van de link. Een voorbeeld is de 'a'-tag in combinatie met de waarde van 'href'.
Het onderscheidingsteken is ';'.
Tag en variabele-naam worden gescheiden door een ','
save_extensions_in In deze file worden alle gebruikte file-extensies opgelagen plus de files waarin deze extensies worden gebruikt.
Subdirectories zijn toegestaan
save_links_in In deze file worden alle links opgeslagen.
Subdirectories zijn toegestaan
save_local_links_in De files die lokaal worden opgeslagen kunnen een andere naam toegewezen krijgen. Die namen en hun orgineel staan in deze file. De n-de file-naam uit "save_links_in" staat in relatie met de n-de file-naam in "save_local_links_in".
Subdirectories zijn toegestaan
save_deadlinks_in Links die niet wijzen naar een file op de server worden in deze file opgeslagen.
Subdirectories zijn toegestaan
save_not_searched_extensions_in Extensies van files die niet worden geprocessed worden hierin opgeslagen.
Subdirectories zijn toegestaan
save_not_searched_tags_in Tags die niet op links worden onderzocht worden in deze file opgeslagen. Subdirectories zijn toegestaan
save_to_long_filenames_in File-namen die te lang zijn worden in deze file opgeslagen.
Subdirectories zijn toegestaan

"archipol.txt" is een listing van het programma voorzien van regelnummers.

In regel 1 staat het path aangegeven van het programma "perl". Dit path wordt alleen in UNIX gebruikt. Eventuele opties zoals '-w' worden in alle operating-systemen meegenomen.

6: use LWP::UserAgent
The LWP::UserAgent is a class implementing a simple World-Wide Web user agent in Perl. It brings together the HTTP::Request, HTTP::Response and the LWP::Protocol classes that form the rest of the core of libwww-perl library. For simple uses this class can be used directly to dispatch WWW requests, alternatively it can be subclassed for application-specific behaviour.

7. use HTML::LinkExtor
HTML::LinkExtor is an HTML parser that extracts links from an HTML document. The HTML::LinkExtor is a subclass of HTML::Parser. This means that the document should be given to the parser by calling the $p->parse() or $p->parse_file() methods.

8. use URI
This module implements the URI class. Objects of this class represent ``Uniform Resource Identifier references'' as specified in RFC 2396

9. use File::Basename
These routines allow you to parse file specifications into useful pieces using the syntax of different operating systems.

10. use File::Path
Create or remove directory trees

62. sub print_array
Print een array. Deze routine wordt voor debug-doeleinden gebruikt.

71. sub print_hash
Print een hash. Deze routine wordt voor debug-doeleinden gebruikt.

82. sub print_links
Print url's. Deze routine wordt voor debug-doeleinden gebruikt.

98. sub print_header
Routine om een HTML-header te printen.

111. sub print_tai
Print de HTML-tail.

119. sub read_inifile
Lees de ini-file.

161. sub ini_globals
Ken de waarden uit de ini-file toe aan de globale variabelen.

223. sub create_paths
Creëert alle directories. Maakt gebruik van "@g_wfiles".

232. sub open_and_close_all_files_for_writing
Opent alle files om te schrijven en sluit deze weer.

242. sub ini_hrefs
Alle files die als eerste moeten worden gedownload (0 of meer) worden in '@g_hrefs' en '%g_hrefs' gezet. De namen van deze files komen uit de ini-file en uit "sitemap.txt".

269. sub read_do_not_process
Alle files met de naam uit de file "do_not_process.txt" worden niet gedownload en ge'proccessed'.

289. ############### MAIN
Hier begint het hoofdprogramma.

306. my $number= 0; # Paginanummer
Voor elke nieuw onderzochte link wordt '$number' met 1 verhoogd.

307. my $ua = new LWP::UserAgent
De class van de zoekmachine.

312. my $parser= HTML::LinkExtor->new( )
De parser.

344. while( $number <= $#g_hrefs) # @g_hrefs grows while searching
De zoekaktie gaat door totdat '$number' groter is dan het aantal links in de array. De array groeit tijdens de zoekaktie totdat alle links gevonden zijn.

359. $filename=~ s/([^a-zA-Z0-9\-\_\.])/sprintf( '%%%02X', ord($1))/eg
Niet alle leestekens zijn toegestaan als filenaam. Alle bijzondere tekens worden in hun hexadecimale waarde vertaald, voorafgegaan door een '%'-teken.

365. my @newhrefs; # clear array

366. my @newtags; # clear array
Alle nieuwe links en tags uit een pagina komen in deze array.

368. $res = $ua->request(HTTP::Request->new(GET => $url))
Haal de pagina op.

393. $full_filename= $g_save_files_in. $dir. $filename
Bewaar de file op disk.

402. {
Zoek alle tags met de links (@newhrefs) in de pagina.

439. }

443. ##### search for new ref's
Zoek naar nieuwe links.

449. if( $href=~ s/^$g_root//i)
Alleen links in de root.

451. if( !( $href=~ /^mailto:/i))
Geen Mail-adressen

498. if( ( !$g_do_not_search_extensions{ $ext} or !$ext)
Met de juiste extensie

529. }

532. for( $i= 0; $i<= $#newtags; $i++)
Zoek naar links om te downloaden.

544.}

545. # search for extra download
Zoek in de pagina's naar extra links die buiten de tags vallen.

573. }

574. $i= 0;
Doe de eigenlijke download.

701. }

703. else ## if $res->{ "_msg"} ne "OK"
Wat te doen als de download niet is gelukt.

705. # Na 60x "Can't connect" de volgende.
Zestig keer wordt getracht een nieuwe verbinding met de server te leggen als dat eerder niet lukte.

726. }
KLAAR

727. if( %g_deadlinks)
Schrijf alle foute links en de pagina's waarin die links voorkomen in een file.

758. if( %g_not_searched_tags)
Schrijf alle tags en de pagina's waarin die tags voorkomen die niet zijn onderzocht in een file.

783. if( %g_not_searched_extensions)
Schrijf alle extensies en de pagina's waarin die extensies voorkomen in een file die niet zijn onderzocht.

804. if( %g_extensions)
Schrijf alle extensies in een file.

Download:
archipol.tar.gz
archipol.zip

Terug naar Project