来自欧洲 PMC 注释的批量数据 api
Bulk Data from Europe PMC annotation api
我有一个 pmc.txt 文件,其中包含至少 20k 个 pmc id,而 api 我认为每次只需要 1000 个请求。我已经为一个 id 编写了代码,但我无法为整个文件编写代码,下面是我的主要代码。请帮忙
if __name__ == '__main__':
URL = 'https://www.ebi.ac.uk/europepmc/annotations_api/annotationsByArticleIds'
article_ids = ['PMC:4771370']
for article_id in article_ids:
params = {
'articleIds': article_id,
'section': 'Abstract',
'provider': 'Europe PMC',
'format': 'JSON'
}
json_data = requests.get(URL, params=params).content
r = json.loads(json_data)
df = json_to_dataframe(r)
print(df)
df.to_csv("data.csv")
您可以像这样从文件中读取数据:
with open('pmc.txt', 'r') as file:
article_ids = [item.replace('\n', '') for item in file]
你可以代替 article_ids = ['PMC:4771370']
尽管您将不得不使用不同的名称保存文件(届时您将拥有 20,000 个文件,或者您必须在将数据设为 csv 之前将 json 数据附加到数据框)
因此,您可以将 ID 分成多个块并在单个 articleid 参数中使用它们
if __name__ == '__main__':
URL = 'https://www.ebi.ac.uk/europepmc/annotations_api/annotationsByArticleIds'
with open('corpus_processing_input.txt', 'r') as file:
article_ids = [item.replace('\n', '') for item in file]
# API only allows 1-8 ids sent at a time
chunks = [article_ids[x:x+8] for x in range(0, len(article_ids), 8)]
for count, article_ids in enumerate(chunks):
params = {
'articleIds': ','.join(article_ids),
'section': 'Abstract',
'provider': 'Europe PMC',
'format': 'JSON'
}
json_data = requests.get(URL, params=params).content
r = json.loads(json_data)
df = json_to_dataframe(r)
print(df)
df.to_csv(f"data{count}.csv")
您可以使用grequests. You can try setting stream=False in grequests.get, or call explicitly response.close() after reading response.content. It's discussed in detail here
此外,您还可以测试requests-futures。 Grequests 速度更快,但会带来猴子补丁和其他依赖性问题。 requests-futures 比 grequests 慢几倍,但简单地将请求包装到 ThreadPoolExecutor 中可以和 grequests 一样快,但没有外部依赖。参考 here.
我有一个 pmc.txt 文件,其中包含至少 20k 个 pmc id,而 api 我认为每次只需要 1000 个请求。我已经为一个 id 编写了代码,但我无法为整个文件编写代码,下面是我的主要代码。请帮忙
if __name__ == '__main__':
URL = 'https://www.ebi.ac.uk/europepmc/annotations_api/annotationsByArticleIds'
article_ids = ['PMC:4771370']
for article_id in article_ids:
params = {
'articleIds': article_id,
'section': 'Abstract',
'provider': 'Europe PMC',
'format': 'JSON'
}
json_data = requests.get(URL, params=params).content
r = json.loads(json_data)
df = json_to_dataframe(r)
print(df)
df.to_csv("data.csv")
您可以像这样从文件中读取数据:
with open('pmc.txt', 'r') as file:
article_ids = [item.replace('\n', '') for item in file]
你可以代替 article_ids = ['PMC:4771370']
尽管您将不得不使用不同的名称保存文件(届时您将拥有 20,000 个文件,或者您必须在将数据设为 csv 之前将 json 数据附加到数据框)
因此,您可以将 ID 分成多个块并在单个 articleid 参数中使用它们
if __name__ == '__main__':
URL = 'https://www.ebi.ac.uk/europepmc/annotations_api/annotationsByArticleIds'
with open('corpus_processing_input.txt', 'r') as file:
article_ids = [item.replace('\n', '') for item in file]
# API only allows 1-8 ids sent at a time
chunks = [article_ids[x:x+8] for x in range(0, len(article_ids), 8)]
for count, article_ids in enumerate(chunks):
params = {
'articleIds': ','.join(article_ids),
'section': 'Abstract',
'provider': 'Europe PMC',
'format': 'JSON'
}
json_data = requests.get(URL, params=params).content
r = json.loads(json_data)
df = json_to_dataframe(r)
print(df)
df.to_csv(f"data{count}.csv")
您可以使用grequests. You can try setting stream=False in grequests.get, or call explicitly response.close() after reading response.content. It's discussed in detail here
此外,您还可以测试requests-futures。 Grequests 速度更快,但会带来猴子补丁和其他依赖性问题。 requests-futures 比 grequests 慢几倍,但简单地将请求包装到 ThreadPoolExecutor 中可以和 grequests 一样快,但没有外部依赖。参考 here.