In diesem Artikel werden wir uns mit der Methode befassen, die am Tag zuvor neu registrierte Literatur zum neuen Koronavirus aus der Datenbank für medizinische Literatur zu extrahieren und automatisch an LINE zu senden. Der Hauptinhalt besteht darin, Dokumente, die mit einem bestimmten Schlüsselwort übereinstimmen, aus einer Datenbank namens PubMed zu extrahieren.
Wenn Sie ein neues Papier haben, werden Sie wie folgt benachrichtigt.
Ohne es sieht es so aus.
Python 3.6.5
beautifulsoup4==4.9.0
requests==2.23.0
urllib3==1.25.9
Dieses Mal werden wir PubMed als Datenbank für medizinische Literatur verwenden. PubMed ist eine Datenbank, die vom NCBI (Nationales Zentrum für Biowissenschaften) in NLM (National Medical Books) erstellt wurde. Sie können nach Dokumenten suchen, die in wichtigen medizinischen Fachzeitschriften auf der ganzen Welt veröffentlicht wurden.
Als nächstes wurden als Schlüsselwort häufig die Wörter "Coronavirus" und "Covid-19" verwendet, wenn ich mich mit dem neuen Koronavirus befasste. Deshalb habe ich mich dieses Mal entschlossen, die Literatur zu extrahieren, die entweder das Wort "Coronavirus" oder "Covod-19" enthält.
Ich habe die API von PubMed verwendet, um Literatur aus PubMed zu extrahieren. In PubMed sind mehrere APIs verfügbar, aber ich habe ESearch und EFetch verwendet. Weitere Informationen finden Sie unter Dokumentation.
Mit ESearch können Sie eine Liste der Artikel-IDs abrufen, die Ihrer Suchformel entsprechen. Basierend auf dieser URL
http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=
Wenn Sie nach "term =" einen Suchausdruck einfügen, wird die ID zurückgegeben, die dem Suchausdruck entspricht.
Versuchen Sie zum Beispiel "Corona-Virus".
http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=coronavirus
Wenn Sie die obige URL in Ihren Browser eingeben, wird ein solches Ergebnis angezeigt.
Ich habe die ID des Papiers erfolgreich erhalten. Anzahl bedeutet die Anzahl der Dokumente, die mit der Suchformel übereinstimmen, und retmax bedeutet die Anzahl der Dokumente, die übereinstimmen und angezeigt werden. Der Anfangswert von retmax ist 20, aber Sie können bis zu 100.000 erhalten.
Um beispielsweise retmax auf 100 zu ändern, müssen Sie der URL "retmax = 100" hinzufügen.
http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=coronavirus&retmax=100
Wenn Sie die obige URL im Browser eingeben, Es sieht aus wie. Die Anzahl der angezeigten Dokumente wurde auf 100 erhöht.
Sie können einige Bedingungen hinzufügen, um die Literatur zu extrahieren, z. B. "retmax". Dieses Mal werden wir zusätzlich zu "retmax" "field", "mindate" und "maxdate" verwenden.
In "Feld" können Sie den Suchort aus "Titel" oder "Zusammenfassung" auswählen. Mit "mindate" und "maxdate" können Sie entscheiden, wann bis zu dem Zeitpunkt, zu dem das Dokument als Ziel ausgewählt wurde, bis zu dem Datum, an dem das Dokument in PubMed registriert wurde. Wenn Sie beispielsweise die Literatur von April 2019 bis April 2020 nur nach Titel durchsuchen möchten,
&field=title&mindate=2019/4/1&maxdate=2020/4/31
Hinzufügen.
Erstellen Sie zunächst eine URL, um die ID des Artikels nachzuschlagen, der der Suchformel entspricht. Dieses Mal verwende ich eine Suchformel, die "Coronavirus" und "covid-19" mit einem OP verbindet.
URL für Esearch erstellen
import time
def make_url(yesterday,query):
"""
Erstellen Sie eine URL für Esearch
Argumente: Datum, Suchausdruck
Rückgabewert: str Typ URL
"""
#Grundlegende URL suchen
baseURL="http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term="
#Beschränken Sie den Suchbereich auf Titel oder Abstracts
field="field=title/abstract"
#Die maximale Anzahl von IDs, die erfasst werden können, wurde auf 1000 geändert
retmax="retmax=1000"
#Nur für die gestrige Literatur
mindate="mindate={}".format(yesterday)
maxdate="maxdate={}".format(yesterday)
#Kombinieren Sie jede Zeichenfolge
url="&".join([baseURL+query,field,retmax,mindate,maxdate])
time.sleep(5)
return url
Nachdem Sie die URL erstellt haben, verwenden Sie sie, um eine Liste der IDs abzurufen. Wir verwenden Beautiful Soup, um das Erhalten eines Ausweises zu erleichtern.
Beziehen Sie die Artikel-ID von Esearch
from bs4 import BeautifulSoup
from urllib.parse import urljoin
import urllib.request
def get_id(url):
"""
Erwerb des Papierausweises
Argumente: Forschungs-URL
Rückgabewert: Liste der IDs
"""
#Holen Sie sich eine Liste der IDs mit ESearch
article_id_list=urllib.request.urlopen(url)
#Nur ID abrufen
bs=BeautifulSoup(article_id_list,"html.parser")
ids=bs.find_all("id")
return ids
Verwenden Sie EFetch, um Informationen wie Titel und Abstracts aus der Artikel-ID abzurufen. Diese URL ist die Basis.
https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id=
Sie können die Informationen des Papiers erhalten, indem Sie die ID des Papiers in "id =" eingeben.
Informationen auf dem Papier erhalten Sie aus jeder von ESearch erhaltenen ID.
Holen Sie sich den Titel und die URL des Papiers
from bs4 import BeautifulSoup
import urllib.request
import time
def get_summary(id):
"""
Holen Sie sich eine Zusammenfassung des Papiers
Argument: id
Rückgabewert: Titel, URL des Artikels
"""
#EFetch Basis-URL
serchURL = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id="
search_url=serchURL+id.text+"&retmode=xml"
summary=urllib.request.urlopen(search_url)
summary_bs=BeautifulSoup(summary,"html.parser")
#Die Dokument-URL wird aus der Artikel-ID erstellt
article_URL="https://pubmed.ncbi.nlm.nih.gov/{}/".format(id.text)
#Extrahieren Sie den Titel der Literatur
title=summary_bs.find("articletitle")
title=title.text
time.sleep(5)
return title,article_URL
Danach werden die Informationen des erfassten Papiers ausgegeben. Sie können eine Nachricht von Python an LINE senden, indem Sie LINE Notify verwenden. Ich habe auf [diesen Artikel] verwiesen (https://qiita.com/moriita/items/5b199ac6b14ceaa4f7c9).
An LINE senden
def output_line(line_access_token,message):
"""
Benachrichtigung an LINE senden
Argumente: Zugriffstoken, Benachrichtigungsinhalt
Rückgabewert: Keine
"""
line_url = "https://notify-api.line.me/api/notify"
line_headers = {'Authorization': 'Bearer ' + line_access_token}
payload = {'message': message}
r=requests.post(line_url, headers=line_headers, params=payload,)
python
from bs4 import BeautifulSoup
from urllib.parse import urljoin
from datetime import date,timedelta
import urllib.request
import requests
import time
def main():
"""
Hauptverarbeitung
"""
#LINE-Zugriffstoken
line_access_token = 'LINE-Zugriffstoken'
#Verabredung bekommen
yesterday=date.today()-timedelta(days=1)
yesterday="/".join([str(yesterday.year),str(yesterday.month),str(yesterday.day)])
#Suchformel
query="coronavirus+OR+covid-19"
#Holen Sie sich den Esearch-Link
URL=make_url(yesterday,query)
#Holen Sie sich die ID des Papiers
ids=get_id(URL)
#Wenn es kein neues Papier gibt
if ids == []:
message="Covid-Es gibt keine 19 neuen Papiere"
output_line(line_access_token,message)
#Wenn es ein neues Papier gibt
else:
for id in ids:
#Holen Sie sich den Titel und die URL des Papiers
title,article_URL=get_summary(id)
#Senden Sie eine Benachrichtigung an LINE
message="""{}
{}""".format(title,article_URL)
output_line(line_access_token,message)
def make_url(yesterday,query):
"""
Erstellen Sie eine URL für Esearch
Argumente: Datum, Suchausdruck
Rückgabewert: str Typ URL
"""
#Grundlegende URL suchen
baseURL="http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term="
#Beschränken Sie den Suchbereich auf Titel oder Abstracts
field="field=title/abstract"
#Die maximale Anzahl von IDs, die erfasst werden können, wurde auf 1000 geändert
retmax="retmax=1000"
#Nur für die gestrige Literatur
mindate="mindate={}".format(yesterday)
maxdate="maxdate={}".format(yesterday)
#Kombinieren Sie jede Zeichenfolge
url="&".join([baseURL+query,field,retmax,mindate,maxdate])
time.sleep(5)
return url
def get_id(url):
"""
Erwerb des Papierausweises
Argumente: Forschungs-URL
Rückgabewert: Liste der IDs
"""
#Holen Sie sich eine Liste der IDs mit ESearch
article_id_list=urllib.request.urlopen(url)
#Nur ID abrufen
bs=BeautifulSoup(article_id_list,"html.parser")
ids=bs.find_all("id")
return ids
def get_summary(id):
"""
Holen Sie sich eine Zusammenfassung des Papiers
Argument: id
Rückgabewert: Titel, URL des Artikels
"""
#EFetch Basis-URL
serchURL = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id="
search_url=serchURL+id.text+"&retmode=xml"
summary=urllib.request.urlopen(search_url)
summary_bs=BeautifulSoup(summary,"html.parser")
#Die Dokument-URL wird aus der Artikel-ID erstellt
article_URL="https://pubmed.ncbi.nlm.nih.gov/{}/".format(id.text)
#Extrahieren Sie den Titel der Literatur
title=summary_bs.find("articletitle")
title=title.text
time.sleep(5)
return title,article_URL
def output_line(line_access_token,message):
"""
Benachrichtigung an LINE senden
Argumente: Zugriffstoken, Benachrichtigungsinhalt
Rückgabewert: Keine
"""
line_url = "https://notify-api.line.me/api/notify"
line_headers = {'Authorization': 'Bearer ' + line_access_token}
payload = {'message': message}
r=requests.post(line_url, headers=line_headers, params=payload,)
if __name__ == "__main__":
main()
Wenn Sie dies anschließend mit cron ausführen, können Sie den Titel und die URL des Dokuments jeden Tag automatisch an LINE senden.
Recommended Posts