Benutzer:Robot Monk/Michigan Crawler.ahk

/***************************************
*****   Michigan-Crawler   *************
****************************************

Benutzung:
	AutoHotkey installieren, falls noch nicht geschehen
	Script unter Michigan-Crawler.ahk speichern
	Im Browser die URL-Adresse der ersten Seite finden (die gewünschte Zoom-Stufe auswählen usw)
	Script starten
	Die URL-Adresse eingeben (Als Default steht da das Buch "Die Musen 1813")
	Den Ziel-Ordner für die Scans auswählen
	Warten...  Der Fortschritt kann im eingegebenen Ordner überwacht werden.
	
	Wenn nötig, kann das Script vorzeitig gestoppt werden: Rechtsklik auf das "H"-Symbol im System Tray, "Exit" wählen.
**************************************** 
*/


InputBox, seite, Erste Seite eingeben, Geben Sie die URL der ersten Seite des Buches ein,,,,,,,, http://babel.hathitrust.org/cgi/m/mdp/pt?seq=5&view=image&id=mdp.39015037389668&size=400

FileSelectFolder, dest, , , Wählen Sie den Ziel-Ordner für die Scans.


Loop
{
	content:=LadeHTMLSeite(seite, "Page.htm")
	bildLink:=ListMitLinks(seite, content, "src=""(/cache/.*?)""", 1)
	LadeBild(bildLink, dest)
	seite:=ListMitLinks(seite, content, "ext \[n\]"" href=""(htt.*?)""", 1)
	if ! seite
	{
		msgBox, Michigan-Crawler: %A_Index% Bilder runtergeladen
		ExitApp
	}

        Sleep 5000 ; Zeitverzögerung. Gegebenenfalls anpassen: 1000 entspricht einer Sekunde.
}


LadeBild(bildPath, wohin, pattern="", replacement="")	
{		
		;msgbox, % bildPath
		bildName:=RegExReplace(bildPath, "[^\w\.]", "-")
		;msgbox, % bildName
		StringReplace, bildName, bildName, http---
		;msgbox, % bildName
		if(pattern)
			bildName:=RegExReplace(bildName, pattern, replacement)
			
		bildName:=wohin . "\" . bildName
		;msgbox, % bildName
		;IniWrite, %bildName%, Global.ini, Internet, amLaden
		;IniWrite, 0, Global.ini, Internet, Bild_Geladen
		ifNotExist, %bildName% 
		{
			UrlDownloadToFile, %bildPath%, %bildName%
			if ErrorLevel {
				FileAppend, % A_Now() . " Problem beim Laden " . bildPath . "`n", % A_ScriptDir . "\LadeBild.txt"
				;MsgBox ,,,Problem LadeBild %bildPath% %bildName%,1
				;MsgBox ,,,Problem LadeBild,1
				SoundBeep, 1000, 100
				
				FileDelete, %bildName%
				ExitApp
			}
			FileAppend, % A_Now() . " " . bildPath . "-->" . bildName . "`n", % A_ScriptDir . "\LadeBild.txt"
			;doppelBild:=IsDupeFile(bildName)
			if doppelBild
			{
				SoundBeep, 750, 500
				FileAppend, % BildPath . " ist doppelt mit " . doppelBild . "`n", % A_ScriptDir . "\DoppelBild.txt"
			}
			return bildName
		}
		return bildName
		
}

LadeHTMLSeite(homepage, wohin)
{
	If (Instr(homepage, "/")) 	;Nur für nicht lokale Dateien
	{
		UrlDownloadToFile, %homepage%, %wohin%
		if ErrorLevel
		{
			FileAppend, % A_Now() . Problem LadeHTMLSeite . homepage . "`n", % A_ScriptDir . "\LogInternetTools.txt"
			;MsgBox,,, Problem LadeHTMLSeite,1
		}
	}
	else wohin:=homepage		;Lokale Dateien direct in variable laden
	FileRead, content, %wohin%

	content:=RegExReplace(content, "[\r\n]", "")
	content:=RegExReplace(content, "\s{2,}", " ")
	return content
}

ListMitLinks(url, content, pattern, numOfMatch)
{
		if ! content
			content:=LadeHTMLSeite(homepage, "PageListMitLinks.htm") ; umgestiegen auf content-Variable (is besser)
	
		if (RegExMatch(content, "i)<base\shref.+?['""](.+?)['""]>", baseAddr)>0)
		{
			url:=baseAddr1
		}

		homepage:=url

		foundPos:=0
		j:=1
		Loop 
		{			
			foundPos:= RegExMatch(content, pattern , bild, foundPos+1)
			if (foundPos==0) 
			{	
				j--
				break
			}
			list:=list . LinkFullPath(homepage, bild%numOfMatch%) . "`n"
			j++
		}
		
		if (j<1)
		{
			FileAppend, % A_Now() . " cannot match " . homepage . "`n", % A_ScriptDir . "\LogInternetTools.txt" 
			;Run, % A_ScriptDir . "\LogInternetTools.txt" 
		}
		else
		{
			FileAppend, % A_Now() . " matched " . j . " sites " . homepage . "`n", % A_ScriptDir . "\LogInternetTools.txt" 
			
		}
		list:=RegExReplace(list, "\s$", "")
		return list

}	

A_Now()
{
	FormatTime, var, , HH:mm:ss dd.MM.yyyy
	return var
}

LinkFullPath(domain, site)
{
	if (SubStr(site, 1, 7)=="http://")
		return site

	site:=RegExReplace(site, "(\.\./)", "", count)
	if (InStr(domain, "?"))
		domain:=SubStr(domain, 1, InStr(domain, "?")-1)

	if ( SubStr(site, 1, 1)=="/")
		domain:=SubStr(domain, 1, InStr(domain, "/", false, 8)-1)	;ab pos 8, damit http:// nicht erkannt wird
	else
		domain:=SubStr(domain, 1, InStr(domain, "/", false,0))

	Loop %count%
	{
		domain:=SubStr(domain, 1, StrLen(domain)-1)
		domain:=SubStr(domain, 1, InStr(domain, "/", false, 0))
	}
	return domain . site
}