Ich habe versucht, die Literatur des neuen Corona-Virus mit Python automatisch an LINE zu senden

Überblick

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

Umgebung

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

Datenbank- und Schlüsselwortauswahl

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.

PubMed API

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.

ESearch_Overview

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

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

ESearch_code

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

EFetch_ Übersicht

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.

EFetch_-Code

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

LINE Notify_-Code

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

Ganzer Code

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

Ich habe versucht, die Literatur des neuen Corona-Virus mit Python automatisch an LINE zu senden
Ich habe versucht, die Standardrolle neuer Mitarbeiter mit Python zu optimieren
Ich habe versucht, das Verhalten des neuen Koronavirus mit dem SEIR-Modell vorherzusagen.
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht, die Eigenschaften der neuen Informationen über mit dem Corona-Virus infizierte Personen mit Wordcloud zu visualisieren
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Ich habe versucht, automatisch Bilder von Kanna Hashimoto mit Python zu sammeln! !!
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
Ich habe versucht, die Bewegungen von Wiire-Playern automatisch mit Software zu extrahieren
Ich habe versucht, die Filminformationen der TMDb-API mit Python abzurufen
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Ich habe versucht, Soma Cube mit Python zu lösen
Da die Aktie aufgrund des Einflusses des neuen Corona-Virus eingebrochen ist, habe ich versucht, die Performance meines Investment Trusts mit Python zu visualisieren.
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Ich habe versucht, die Tweets von JAWS DAYS 2017 mit Python + ELK einfach zu visualisieren
Ich habe versucht, die statistischen Daten der neuen Corona mit Python abzurufen und zu analysieren: Daten der Johns Hopkins University
Ich habe versucht, das Bild mit Python + OpenCV "gammakorrektur" zu machen
Ich habe versucht zu simulieren, wie sich die Infektion mit Python ausbreitet
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich habe versucht, die Zugverspätungsinformationen mit LINE Notify zu benachrichtigen
[Python] Ich habe versucht, die folgende Beziehung von Twitter zu visualisieren
[Python] Ich habe versucht, automatisch einen täglichen Bericht über YWT mit Outlook-Mail zu erstellen
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit dplyr von R und pandas von Python zu vergleichen
Beim 15. Offline-Echtzeitversuch habe ich versucht, das Problem des Schreibens mit Python zu lösen
Ich habe versucht, das Ranking des Qiita-Adventskalenders mit Python zu kratzen
Ich habe versucht, die Anfängerausgabe des Ameisenbuchs mit Python zu lösen
Ich habe versucht, zum Zeitpunkt der Bereitstellung mit Fabric und ChatWork Api automatisch in ChatWork zu posten
Ich möchte das Wetter mit LINE bot feat.Heroku + Python wissen
Ich habe versucht, die Bewässerung des Pflanzgefäßes mit Raspberry Pi zu automatisieren
Ich habe versucht, das Problem von F02 zu lösen, wie man mit Python offline in Echtzeit schreibt
Ich möchte den Anfang des nächsten Monats mit Python ausgeben
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen
Ich habe versucht zu beheben "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren"
Ich habe versucht, die Größe des logischen Volumes mit LVM zu erweitern
Ich schrieb einen Test in "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren".
PhytoMine-I hat versucht, mit Python die genetischen Informationen der Pflanze zu erhalten
Ich habe versucht, das automatische Senden einer E-Mail durch Doppelklicken auf das Symbol [Python] zu ermöglichen
Ich habe versucht, die Sprecheridentifikation mithilfe der Sprechererkennungs-API von Azure Cognitive Services mit Python zu überprüfen. # 1
Ich habe versucht, die Sprecheridentifikation mithilfe der Sprechererkennungs-API von Azure Cognitive Services in Python zu überprüfen. # 2
[Python] Ich habe versucht, das Preisgeld von "ONE PIECE" über 100 Millionen Zeichen mit matplotlib zu visualisieren.
Ich habe versucht, die Anzahl der im Inland infizierten Menschen der neuen Korona mit einem mathematischen Modell vorherzusagen
Ich habe versucht, den Inhalt jedes von Python pip gespeicherten Pakets in einer Zeile zusammenzufassen
Ich habe versucht, die erste Frage der Mathematik-Aufnahmeprüfung 2019 der Universität Tokio mit Python Sympy zu lösen
[Python] Ich habe versucht, die Nacht der Galaxienbahn mit WordCloud zu visualisieren!
(Python) Ich habe versucht, 1 Million Hände zu analysieren ~ Ich habe versucht, die Anzahl der AA ~ zu schätzen
Ich habe es mit den Top 100 PyPI-Paketen versucht.> Ich habe versucht, die auf Python installierten Pakete grafisch darzustellen
Ich habe versucht, die Beschleunigung von Python durch Cython zu verifizieren und zu analysieren
Ich habe versucht, die Negativität von Nono Morikubo zu analysieren. [Vergleiche mit Posipa]
[Outlook] Ich habe versucht, mit Python automatisch eine tägliche Berichtsmail zu erstellen
Ich habe versucht, den Text des Romans "Wetterkind" mit Word Cloud zu visualisieren
Ich habe versucht, das RSS des Top-Songs des iTunes Store automatisch abzurufen
Ich habe versucht, die Neujahrskarte selbst mit Python zu analysieren
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
Ich habe Hunderte Millionen SQLite mit Python ausprobiert