Sitat av
Anonym bruker
Kan du få denne til å fungere med aviser også? Eksempel:
https://www.nb.no/items/6ad2a29de1ae...852ef00b99b146
Om det er noen som vet/ gjetter hvordan begrensede bøker og aviser fungerer? Hvordan begrenser de?
1. Tror du bøkene ligger på internett, eller kun lokalt på bibliotekene?
2. Har de en iprange kun åpen for bibliotene?
3. Er de krypterte?
4. Ligger de egentlig helt åpne på internettet, men under et annet subdomene eller noe?
Hadde vært fristende å dratt til et slikt bibliotek å sjekke hva URL-en egentlig er der.
Oppdatert scriptet for aviser også.
En kjører det likt som ved bøker, men slenger på en ekstra --avis
Fremgangsmetoden for ID er lik som for bøker, men på avis er den noe lengre, for
eksempelet ditt er ID som må brukes alt etter digiavis_, dermed arbeiderbladetoslo_null_null_19621224_77_299_1
Vær også oppmerksom på at det bruker noe lengre tid på å kjøre, da sidene er satt sammen av flere bilder. Denne består av 54 bilder per side (ved level/maxLevel 5/5).
Sitat av
snippsat
Lanjelin viss du vil ha en Python 3.6 version i Repo ditt.
Skrevet rask om med hjelp av noen verktøy,også litt nærmere
PEP-8 .
Jeg trenges ikke og nevnes viss du bruker koden i Repo.
SPOILER ALERT! Vis spoiler
Kode
# nbno_3.py
# A rewrite to Python 3.6 of @Lanjelin nbno.py
# It works just the same:
# python nbno_3.py --id 2007091701011
import io
import urllib.request
import urllib.error
import urllib.parse
import os
import argparse
from PIL import Image
class theURL():
def __init__(self, bokID):
self.bokID = str(bokID)
self.side = '0001'
self.level = 5
self.maxLevel = 5
self.col = 0
self.maxcol = 0
self.row = 0
self.maxrow = 0
self.resX = '9999'
self.resY = '9999'
self.tileWidth = '1024'
self.tileHeight = '1024'
self.URL = ''
def setLevel(self, level):
self.level = int(level)
def setMaxLevel(self, maxLevel):
self.maxLevel = int(maxLevel)
def updateURL(self):
self.URL = 'http://www.nb.no/services/image/resolver?url_ver=geneza&urn=URN:NBN:no-nb_digibok_' +\
str(self.bokID) + '_' + self.side +\
'&maxLevel=' + str(self.maxLevel) + '&level=' + str(self.level) +\
'&col=' + str(self.col) + '&row=' + str(self.row) +\
'&resX=' + str(self.resX) + '&resY=' + str(self.resY) +\
'&tileWidth=' + str(self.tileWidth) + \
'&tileHeight=' + str(self.tileWidth)
def newURL(self, side, col, row):
self.side = str(side)
self.col = int(col)
self.row = int(row)
self.updateURL()
return self.URL
def updateMaxColRow(self, side):
c, r = 0, 0
while True:
xUrl = self.newURL(side, c, '0')
try:
req = urllib.request.Request(
xUrl, headers={'User-Agent': 'Mozilla/5.0'})
response = urllib.request.urlopen(req)
except urllib.error.HTTPError as e:
c -= 1
break
else:
c += 1
while True:
xUrl = self.newURL(side, '0', r)
try:
req = urllib.request.Request(
xUrl, headers={'User-Agent': 'Mozilla/5.0'})
response = urllib.request.urlopen(req)
except urllib.error.HTTPError as e:
r -= 1
break
else:
r += 1
self.maxcol = int(c)
self.maxrow = int(r)
return str(c) + str(r)
def downloadPage(pageNum, bok):
imageParts = []
maxWidth, maxHeight = 0, 0
r = 0
while (r <= bok.maxrow):
c = 0
while (c <= bok.maxcol):
url = bok.newURL(pageNum, c, r)
try:
req = urllib.request.Request(
url, headers={'User-Agent': 'Mozilla/5.0'})
response = urllib.request.urlopen(req).read()
except urllib.error.HTTPError as e:
# print e
error = e # spiser bare denne da første ugyldige side spytter ut feilmeldinger før stopp
else:
img = Image.open(io.BytesIO(response))
imageParts.append(img)
if (r == 0):
maxWidth += img.size[0]
if (c == 0):
maxHeight += img.size[1]
c += 1
r += 1
if (len(imageParts) == 0):
print('Ferdig med å laste ned alle sider.')
exit()
else:
sinWidth, sinHeight = imageParts[0].size
newImg = Image.new('RGB', (maxWidth, maxHeight))
r = 0
partCount = 0
while (r <= bok.maxrow):
c = 0
while (c <= bok.maxcol):
newImg.paste(imageParts[partCount],
((c * sinWidth), (r * sinHeight)))
partCount += 1
c += 1
r += 1
newImg.save(folder + str(pageNum) + '.jpg')
print('Lagret side ' + pageNum + '.jpg')
# print 'MaxWidth: '+str(maxWidth)+' MaxHeight: '+str(maxHeight)
# print 'SingleWidth: '+str(sinWidth)+' SingleHeight: '+str(sinHeight)
# print 'Antall bilder per side: '+str(len(imageParts))
parser = argparse.ArgumentParser()
optional = parser._action_groups.pop()
required = parser.add_argument_group('required arguments')
required.add_argument('--id', metavar='<bokID>',help='IDen på boken som skal lastes ned', default=False)
optional.add_argument('--start', metavar='<int>', help='Sidetall å starte på', default=False)
optional.add_argument('--stop', metavar='<int>', help='Sidetall å stoppe på', default=False)
optional.add_argument('--level', metavar='<int>', help='Sett Level', default=False)
optional.add_argument('--maxlevel', metavar='<int>', help='Sett MaxLevel', default=False)
parser._action_groups.append(optional)
args = parser.parse_args()
if args.id:
x = theURL(str(args.id))
print('Laster ned bok med ID: ' + str(args.id))
folder = '.' + os.path.sep + str(x.bokID) + os.path.sep
try:
os.stat(folder)
except:
os.mkdir(folder)
if args.level:
x.setLevel(int(args.level))
if args.maxlevel:
x.setMaxLevel(int(args.maxlevel))
x.updateMaxColRow('C1')
downloadPage('C1', x)
x.updateMaxColRow('C2')
downloadPage('C2', x)
x.updateMaxColRow('C3')
downloadPage('C3', x)
x.updateMaxColRow('0001')
if args.start:
pageCounter = int(args.start)
else:
pageCounter = 1
if args.stop:
stopPage = int(args.stop)
else:
stopPage = 9999
while True:
downloadPage(str(pageCounter).rjust(4, '0'), x)
if (pageCounter == stopPage):
print('Ferdig med å laste ned alle sider.')
exit()
pageCounter += 1
else:
parser.print_help()
exit()
Hepp, kult, takker!
Har ikke beveget meg så mye over på python 3.6, og har ikke satt opp maskinen for det heller.
Om jeg får kjørt begge parallellt/problemfritt på Mac'en, er det mulig jeg legger det til!
Kodingen min består vel i utgangspunktet av 50% bruk av google, om jeg må legge til litt til for å holde vedlike en 3.6 versjon, bør gå greit.
Sist endret av Lanjelin; 22. april 2018 kl. 19:40.