Невозможно получить все записи из репозитория OAI-PMH с помощью Sickle
Я работал над получением всех записей из репозитория OAI-PHM из различных исследовательских институтов, используя программу Sickle на Python. Я написал код, который выполняет последовательный сбор данных, который перебирает записи различных репозиториев и сохраняет записи как XML-файл, так и в SQL-данные. Ниже приведен отрывок из кода, который определяет последовательную сборку репозитория OAI из небольшого исследовательского учреждения.
Однако по какой-то причине я не могу получить все записи в репозиториях. В приведенном ниже примере для одного учреждения я могу получить только около 2,900 записей из репозитория, хотя при последней проверке значение completeListSize равно 4,041. Если я использую параметр from в сочетании с max_retries и выполняю серию выборочного сбора данных по дате в цикле, я могу получить некоторые дополнительные записи, но не все из них.
Интерфейс OAI, по-видимому, отправляет обратно пустой токен возобновления, указывающий, что все записи были получены и, следовательно, ошибок не возникает. Я подозреваю, что проблема может быть связана с тем, что некоторые записи в репозитории OAI каким-то образом пусты или неполны, и поэтому эта программа считает, что все записи в репозитории были получены.
Я не уверен, можно ли решить проблему, добавив дополнительный параметр, который пропускает пустую запись или выдает повторный запрос или что-то в этом роде?
from sickle import Sickle
import re
import uuid
import pyodbc
import xml.dom.minidom
import xml.sax
api_list = [ \
"https://pure.itu.dk/ws/oai", \
]
date="2020-08.01"
last_retrieval="1950.01.01"
for api in api_list:
institution = ""
institution = inst_institution(api)
record_total=0
sickle = Sickle(api)
harvest_id = uuid.uuid4() # generating a random ID for the record.
recs = sickle.ListRecords(**{'metadataPrefix': 'ddf-mxd', 'from': last_retrieval, 'until': date}, ignore_deleted=True, max_retries ==500000))
headers = sickle.ListIdentifiers(**{'metadataPrefix': 'ddf-mxd', 'from': last_retrieval, 'until': date}, ignore_deleted=True, max_retries ==500000)
for header in headers:
record_total = record_total + 1
try:
r=recs.next()
except IndexError:
record_fail_total = record_fail_total + 1
failed_record_function(harvest_id, Sidste_indhentning, dagsdato, api, institution, record_fail_total, day_of_harvest) # Failed records being saved to SQL table ”records_failed”
rec_id = re.search('rec_id=' + chr(34) + '(.+?)' + chr(34) + ' rec_created=', str(r)).group(1)
print (str(record_total) + " - " + str(rec_id) + " - " + str(institution)) #save a XML-file for each record
Fil_placering = r"C:\Users\sigur\OneDrive\Skrivebord\Data\\itu\\" + str(rec_id) + ".xml"
with open(r"C:\Users\sigur\OneDrive\Skrivebord\Data\\itu\\" + str(rec_id) + ".xml", "w", encoding="UTF-8") as text_file:
print(str(r), file=text_file)