我正在尝试使用以下代码获取ArXiv API:
import urllib.request
import pandas as pd
import xml.etree.ElementTree as ET
OAI = "{http://www.openarchives.org/OAI/2.0/}"
ARXIV = "{http://arxiv.org/OAI/arXiv/}"
def harvest(arxiv):
df = pd.DataFrame(columns=("title", "abstract", "categories"))
base_url = "http://export.arxiv.org/oai2?verb=ListRecords&"
url = (base_url +
"from=2012-01-01&until=2019-01-01&" +
"metadataPrefix=arXiv&set=%s"%arxiv)
while True:
print("fetching", url)
response = urllib.request.urlopen(url)
xml = response.read()
root = ET.fromstring(xml)
for record in root.find(OAI+'ListRecords').findall(OAI+"record"):
meta = record.find(OAI+'metadata')
info = meta.find(ARXIV+"arXiv")
categories = info.find(ARXIV+"categories").text
contents = {'title': info.find(ARXIV+"title").text,
'abstract':
info.find(ARXIV+"abstract").text.strip(),
'categories': categories.split(),
}
df = df.append(contents, ignore_index=True)
token = root.find(OAI+'ListRecords').find(OAI+"resumptionToken")
if token is None or token.text is None:
break
else:
url = base_url + "resumptionToken=%s"%(token.text)
return df
df_hep_th = harvest("physics:hep-th")
df_hep_th.to_csv('df_hep_th.csv', sep=',', encoding='utf-8')
我每次都会得到1000篇论文,并将它们附加到数据框上。然后将df保存为csv。
我曾经成功尝试过此代码,例如获得“ physics:hep-ex”类别的结果。起初它运行完美,但是现在我遇到了这个错误,我无法解决它:
File "C:\Users\my_user\Anaconda3\lib\urllib\request.py", line 649, in
http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
HTTPError: Retry after specified interval
答案 0 :(得分:1)
之所以出现此问题,是因为您在短时间内执行了太多请求。看一下Retry After HTTP文档。您应该做的就是获取间隔t
的时间间隔,当您遇到错误时,请使用延迟功能等待t
秒,然后继续运行循环。