Dans cet article, nous traiterons de la méthode d'extraction de la littérature liée au nouveau virus corona nouvellement enregistré la veille à partir de la base de données de la littérature médicale et de son envoi automatique à LINE. Le contenu principal est d'extraire des documents qui correspondent à un certain mot-clé d'une base de données appelée PubMed.
Lorsque vous avez un nouveau papier, vous serez averti comme ceci.
Sans ça, ça ressemble à ça.
Python 3.6.5
beautifulsoup4==4.9.0
requests==2.23.0
urllib3==1.25.9
Cette fois, nous utiliserons PubMed comme base de données de littérature médicale. PubMed est une base de données créée par le NCBI (National Center for Biological Sciences) en NLM (National Medical Books). Vous pouvez rechercher des documents publiés dans les principales revues médicales du monde entier.
Ensuite, comme mot-clé, lorsque j'ai examiné le nouveau virus corona, les mots «virus corona» et «Covid-19» étaient souvent utilisés. Par conséquent, cette fois, j'ai décidé d'extraire la littérature qui contient soit le mot «coronavirus» ou «Covod-19».
J'ai utilisé l'API de PubMed pour extraire la littérature de PubMed. Il existe plusieurs API disponibles dans PubMed, mais j'ai utilisé ESearch et EFetch. Pour plus de détails, veuillez consulter la Documentation.
ESearch vous permet d'obtenir une liste d'ID d'article correspondant à votre formule de recherche. Basé sur cette URL
http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=
Si vous placez une expression de recherche après "term =" dans, l'ID qui correspond à l'expression de recherche sera renvoyé.
Par exemple, essayez "virus corona".
http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=coronavirus
Si vous entrez l'URL ci-dessus dans votre navigateur, vous verrez un résultat comme celui-ci.
J'ai réussi à obtenir l'ID du papier. Count signifie le nombre de documents qui correspondent à la formule de recherche et retmax signifie le nombre de documents qui correspondent et qui s'affichent. La valeur initiale de retmax est 20, mais vous pouvez en obtenir jusqu'à 100 000.
Par exemple, pour changer retmax à 100, vous devez ajouter "retmax = 100" à l'URL.
http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=coronavirus&retmax=100
Si vous entrez l'URL ci-dessus dans le navigateur, On dirait. Le nombre de documents affichés est passé à 100.
Vous pouvez ajouter certaines conditions pour extraire la littérature, telles que "retmax". Cette fois, en plus de "retmax", "field", "mindate" et "maxdate" sont utilisés.
Dans "champ", vous pouvez sélectionner l'emplacement de recherche parmi "titre" ou "résumé". Avec "mindate" et "maxdate", vous pouvez décider entre quand et quand le document est ciblé par la date à laquelle le document a été enregistré dans PubMed. Par exemple, si vous souhaitez rechercher la littérature d'avril 2019 à avril 2020 par titre uniquement,
&field=title&mindate=2019/4/1&maxdate=2020/4/31
Ajouter.
Tout d'abord, créez une URL pour rechercher l'ID de l'article qui correspond à la formule de recherche. Cette fois, j'utilise une formule de recherche qui relie «coronavirus» et «covid-19» à un OR.
Créer une URL pour Esearch
import time
def make_url(yesterday,query):
"""
Créer une URL pour faire des recherches
Arguments: date, expression de recherche
Valeur de retour: url de type str
"""
#URL de base d'Esearch
baseURL="http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term="
#Limiter la portée de la recherche aux titres ou aux résumés
field="field=title/abstract"
#Changement du nombre maximum d'identifiants pouvant être obtenus à 1000
retmax="retmax=1000"
#Uniquement pour la littérature d'hier
mindate="mindate={}".format(yesterday)
maxdate="maxdate={}".format(yesterday)
#Combinez chaque chaîne
url="&".join([baseURL+query,field,retmax,mindate,maxdate])
time.sleep(5)
return url
Une fois que vous avez créé l'URL, utilisez-la pour obtenir une liste d'identifiants. Nous utilisons Beautiful Soup pour faciliter l'obtention d'une pièce d'identité.
Obtenez l'ID d'article d'Esearch
from bs4 import BeautifulSoup
from urllib.parse import urljoin
import urllib.request
def get_id(url):
"""
Acquisition d'une pièce d'identité papier
Arguments: URL de recherche
Valeur de retour: Liste des identifiants
"""
#Obtenez une liste d'identifiants avec ESearch
article_id_list=urllib.request.urlopen(url)
#Obtenir un identifiant uniquement
bs=BeautifulSoup(article_id_list,"html.parser")
ids=bs.find_all("id")
return ids
Utilisez EFetch pour obtenir des informations telles que des titres et des résumés à partir de l'ID d'article. Cette URL est la base.
https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id=
Vous pouvez obtenir les informations du papier en saisissant l'identifiant du papier dans "id =".
Les informations sur le papier sont obtenues à partir de chaque identifiant obtenu par ESearch.
Obtenez le titre et l'URL de l'article
from bs4 import BeautifulSoup
import urllib.request
import time
def get_summary(id):
"""
Obtenez un résumé de l'article
Argument: id
Valeur de retour: Titre, URL de l'article
"""
#EFetch URL de base
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")
#L'URL du document est créée à partir de l'ID d'article
article_URL="https://pubmed.ncbi.nlm.nih.gov/{}/".format(id.text)
#Extraire le titre de la littérature
title=summary_bs.find("articletitle")
title=title.text
time.sleep(5)
return title,article_URL
Après cela, les informations sur le papier acquis sont sorties. Vous pouvez envoyer un message de python à LINE en utilisant LINE Notify. J'ai fait référence à cet article.
Envoyer à LINE
def output_line(line_access_token,message):
"""
Envoyer une notification à LINE
Arguments: jeton d'accès, contenu de notification
Valeur de retour: Aucun
"""
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():
"""
Traitement principal
"""
#Jeton d'accès LINE
line_access_token = 'Jeton d'accès LINE'
#Avoir un rendez-vous
yesterday=date.today()-timedelta(days=1)
yesterday="/".join([str(yesterday.year),str(yesterday.month),str(yesterday.day)])
#Formule de recherche
query="coronavirus+OR+covid-19"
#Obtenir le lien Esearch
URL=make_url(yesterday,query)
#Obtenez l'identifiant du papier
ids=get_id(URL)
#Quand il n'y a pas de nouveau papier
if ids == []:
message="Covid-Il n'y a pas 19 nouveaux articles"
output_line(line_access_token,message)
#Quand il y a un nouveau papier
else:
for id in ids:
#Obtenez le titre et l'URL de l'article
title,article_URL=get_summary(id)
#Envoyer une notification à LINE
message="""{}
{}""".format(title,article_URL)
output_line(line_access_token,message)
def make_url(yesterday,query):
"""
Créer une URL pour faire des recherches
Arguments: date, expression de recherche
Valeur de retour: url de type str
"""
#URL de base d'Esearch
baseURL="http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term="
#Limiter la portée de la recherche aux titres ou aux résumés
field="field=title/abstract"
#Changement du nombre maximum d'identifiants pouvant être obtenus à 1000
retmax="retmax=1000"
#Uniquement pour la littérature d'hier
mindate="mindate={}".format(yesterday)
maxdate="maxdate={}".format(yesterday)
#Combinez chaque chaîne
url="&".join([baseURL+query,field,retmax,mindate,maxdate])
time.sleep(5)
return url
def get_id(url):
"""
Acquisition d'une pièce d'identité papier
Arguments: URL de recherche
Valeur de retour: Liste des identifiants
"""
#Obtenez une liste d'identifiants avec ESearch
article_id_list=urllib.request.urlopen(url)
#Obtenir un identifiant uniquement
bs=BeautifulSoup(article_id_list,"html.parser")
ids=bs.find_all("id")
return ids
def get_summary(id):
"""
Obtenez un résumé de l'article
Argument: id
Valeur de retour: Titre, URL de l'article
"""
#EFetch URL de base
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")
#L'URL du document est créée à partir de l'ID d'article
article_URL="https://pubmed.ncbi.nlm.nih.gov/{}/".format(id.text)
#Extraire le titre de la littérature
title=summary_bs.find("articletitle")
title=title.text
time.sleep(5)
return title,article_URL
def output_line(line_access_token,message):
"""
Envoyer une notification à LINE
Arguments: jeton d'accès, contenu de notification
Valeur de retour: Aucun
"""
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()
Après cela, en exécutant ceci avec cron, vous pouvez envoyer automatiquement le titre et l'URL du document à LINE chaque jour.