J'ai essayé d'envoyer automatiquement la littérature du nouveau virus corona à LINE avec Python

Aperçu

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. 完成イメージ(論文なし)

environnement

Python 3.6.5
beautifulsoup4==4.9.0
requests==2.23.0
urllib3==1.25.9

Sélection de base de données et de mots clés

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».

API PubMed

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_Overview

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. ESearch retmax=20

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, ESearch retmax=100 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.

ESearch_code

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

Présentation de EFetch_

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 =".

EFetch_ code

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

LINE Notify_ code

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,)

Code entier

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.

Recommended Posts

J'ai essayé d'envoyer automatiquement la littérature du nouveau virus corona à LINE avec Python
J'ai essayé de rationaliser le rôle standard des nouveaux employés avec Python
J'ai essayé de prédire le comportement du nouveau virus corona avec le modèle SEIR.
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé de visualiser les caractéristiques des nouvelles informations sur les personnes infectées par le virus corona avec wordcloud
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
J'ai essayé de collecter automatiquement des images de Kanna Hashimoto avec Python! !!
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
J'ai essayé d'extraire automatiquement les mouvements des joueurs Wiire avec un logiciel
J'ai essayé d'obtenir les informations sur le film de l'API TMDb avec Python
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de résoudre Soma Cube avec python
Depuis que le stock a plongé en raison de l'influence du nouveau virus corona, j'ai essayé de visualiser les performances de ma fiducie d'investissement avec Python.
J'ai essayé de résoudre le problème avec Python Vol.1
J'ai essayé de résumer les opérations de chaîne de Python
J'ai essayé de visualiser facilement les tweets de JAWS DAYS 2017 avec Python + ELK
J'ai essayé d'obtenir et d'analyser les données statistiques de la nouvelle Corona avec Python: données de l'Université John's Hopkins
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
J'ai essayé de simuler la propagation de l'infection avec Python
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
J'ai essayé de notifier les informations de retard de train avec LINE Notify
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
[Python] J'ai essayé de créer automatiquement un rapport quotidien de YWT avec la messagerie Outlook
J'ai essayé de comparer la vitesse de traitement avec dplyr de R et pandas de Python
Le 15e temps réel hors ligne, j'ai essayé de résoudre le problème de l'écriture avec python
J'ai essayé de gratter le classement du calendrier de l'avent Qiita avec Python
J'ai essayé de résoudre l'édition du débutant du livre des fourmis avec python
J'ai essayé de publier automatiquement sur ChatWork au moment du déploiement avec Fabric et ChatWork Api
Je veux connaître la météo avec LINE bot avec Heroku + Python
J'ai essayé d'automatiser l'arrosage du pot avec Raspberry Pi
J'ai essayé de résoudre le problème de F02 comment écrire en temps réel hors ligne avec Python
Je veux sortir le début du mois prochain avec Python
J'ai essayé de créer une liste de nombres premiers avec python
J'ai essayé de corriger "J'ai essayé la simulation probabiliste du jeu de bingo avec Python"
J'ai essayé d'agrandir la taille du volume logique avec LVM
J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"
PhytoMine-I a essayé d'obtenir les informations génétiques de la plante avec Python
J'ai essayé de rendre possible l'envoi automatique d'un e-mail en double-cliquant simplement sur l'icône [Python]
J'ai essayé de vérifier l'identification du locuteur par l'API de reconnaissance du locuteur d'Azure Cognitive Services avec Python. # 1
J'ai essayé de vérifier l'identification du locuteur par l'API de reconnaissance du locuteur d'Azure Cognitive Services avec Python. # 2
[Python] J'ai essayé de visualiser le prix en argent de "ONE PIECE" plus de 100 millions de caractères avec matplotlib.
J'ai essayé de prédire le nombre de personnes infectées au niveau national de la nouvelle corona avec un modèle mathématique
J'ai essayé de résumer le contenu de chaque paquet enregistré par Python pip en une seule ligne
J'ai essayé de résoudre la première question de l'examen d'entrée en mathématiques 2019 de l'Université de Tokyo avec python sympy
[Python] J'ai essayé de visualiser la nuit du chemin de fer de la galaxie avec WordCloud!
(Python) J'ai essayé d'analyser 1 million de mains ~ J'ai essayé d'estimer le nombre d'AA ~
J'ai essayé avec les 100 meilleurs packages PyPI> J'ai essayé de représenter graphiquement les packages installés sur Python
J'ai essayé de vérifier et d'analyser l'accélération de Python par Cython
J'ai essayé d'analyser la négativité de Nono Morikubo. [Comparer avec Posipa]
[Outlook] J'ai essayé de créer automatiquement un e-mail de rapport quotidien avec Python
J'ai essayé de visualiser le texte du roman "Weather Child" avec Word Cloud
J'ai essayé d'obtenir automatiquement le RSS de la chanson la plus populaire de l'iTunes Store
J'ai essayé d'analyser la carte du Nouvel An par moi-même en utilisant python
J'ai essayé de "lisser" l'image avec Python + OpenCV
J'ai essayé des centaines de millions de SQLite avec python