[Python-Scraping] Geben Sie die URL und den Titel der Site mit einem bestimmten Schlüsselwort in eine Textdatei ein

Überblick

Wenn Sie eine Google-Suche durchführen und einer der Titel "og: description" "h1" ~ "h4" auf der Treffer-Seite ein bestimmtes Schlüsselwort enthält, werden Titel und URL der Zielseite in Textdateien unterteilt. Ausgabe an. Wenn sich die URL bereits in der Textdatei befindet, überspringen Sie die Verarbeitung.

Python-Version

3.8.2

Ausführungsverfahren

Nach dem Aufbau einer virtuellen Umgebung mit venv etc.

pip install -r requirements.txt
python main.py

Code

requirements.txt

beautifulsoup4 == 4.9.1
requests == 2.24.0

settings.py

settings = {
    #Für die Google-Suche verwendete Schlüsselwörter
    'google_search_keywords': ['Medizinisch', 'Corona'],

    #Anzahl der Suchvorgänge
    'google_search_num': 10,

    #Schlüsselwörter, die auf der Treffer-Seite gesucht werden sollen
    'search_keywords_in_page': ['Medizinisch']
}

main.py

import urllib.parse
import re

import requests
import bs4

from settings import settings
from output import OutputText


def get_ogdesc_from_soup(soup: bs4.BeautifulSoup) -> str:
    """
Aus einer BeautifulSoup-Instanz
    <meta property="og:description" content="...">
Und gibt den Inhalt des Inhalts zurück.
Wenn nicht gefunden, wird ein leeres Zeichen zurückgegeben.
    """
    og_desc = soup.find('meta', attrs={'property': 'og:description', 'content': True})
    if og_desc:
        return og_desc['content']
    return ''


def get_href_from_soup(soup: bs4.BeautifulSoup):
    href = soup.get('href')
    href = re.search('(http)(.+)(&sa)', href).group()[0:-3]  #Unnötiges Entfernen der Zeichenfolge
    href = urllib.parse.unquote(href)  #Dekodieren
    return href


def do_google_search(keywords: [str], search_num: int) -> [str]:
    """
Führen Sie eine Google-Suche mit Schlüsselwörtern durch
Gibt eine Liste der Treffer-URLs zurück
    """
    #Führen Sie die Google-Suche durch
    url = 'https://www.google.co.jp/search'
    params = {
        'hl': 'ja',
        'num': search_num,
        'q': ' '.join(keywords)
    }
    response = requests.get(url, params=params)

    #Gibt eine Liste der Treffer-URLs zurück
    # `.kCrYT`Möglicherweise muss dies aufgrund von Änderungen in den Google-Spezifikationen behoben werden
    soup = bs4.BeautifulSoup(response.content, 'html.parser')
    soups = soup.select('.kCrYT > a')
    return [get_href_from_soup(soup) for soup in soups]


def main():
    output_text = OutputText('output.txt')
    urls = do_google_search(settings['google_search_keywords'], settings['google_search_num'])

    for url in urls:
        #Überspringen Sie die Verarbeitung, wenn die Textdatei bereits die URL enthält
        if url in output_text.get_urls():
            continue

        try:
            response = requests.get(url)
            response.encoding = 'utf-8'
            response.raise_for_status()
        except:
            #Überspringen Sie die Verarbeitung, wenn ein Verbindungsfehler auftritt
            continue

        soup = bs4.BeautifulSoup(response.content, 'html.parser')

        titles = [a.text for a in soup.select('title')]
        desc = get_ogdesc_from_soup(soup)
        h1s = [a.text for a in soup.select('h1')]
        h2s = [a.text for a in soup.select('h2')]
        h3s = [a.text for a in soup.select('h3')]
        h4s = [a.text for a in soup.select('h4')]

        #Überspringen Sie die Verarbeitung, wenn die Seite keine Schlüsselwörter enthält
        no_keyword = True
        for keyword in settings['search_keywords_in_page']:
            for text in titles + [desc] + h1s + h2s + h3s + h4s:
                if keyword in text:
                    no_keyword = False
        if no_keyword:
            continue

        #In Textdatei schreiben
        title = '**No title**' if len(titles) <= 0 else titles[0].strip().replace('\n', '')
        output_text.write(title, url)

    #Textdatei in einfach zu lesendem Format ausgeben
    output_text.output_readable_file()


if __name__ == '__main__':
    main()

output.py

import myutil as u
import os


class OutputText:
    file_path = None

    def __init__(self, file_path):
        self.file_path = file_path

        if not os.path.isfile(file_path):
            file = open(self.file_path, 'w', encoding='utf-8')
            file.close()

    def write(self, title, url):
        with open(self.file_path, mode='a', encoding='utf-8') as f:
            u.write_with_tab(f, title, url)
            f.write('\n')

    def get_urls(self):
        lines = self.get_lines()
        return [self.get_url(line) for line in lines]

    def output_readable_file(self):
        file = self.file_path.replace('.txt', '_readable.txt')
        with open(file, mode='w', encoding='utf-8') as f:
            lines = self.get_lines()
            for line in lines:
                f.write(self.get_title(line) + '\n' + self.get_url(line) + '\n')
                f.write('\n------------------------------\n\n')

    def get_lines(self):
        with open(self.file_path, mode='r', encoding='utf-8') as f:
            text = f.read()
            lines = text.strip().split('\n')
            return lines

    def get_title(self, line):
        texts_in_line = line.split('\t')
        return texts_in_line[0] if len(texts_in_line) >= 1 else ''

    def get_url(self, line):
        texts_in_line = line.split('\t')
        return texts_in_line[1] if len(texts_in_line) >= 2 else ''

myutil.py

def write_with_tab(file, *strings):
    """
Schreiben Sie eine durch Tabulatoren getrennte Zeichenfolge in die Datei
    """
    for i, string in enumerate(strings):
        file.write(string)
        if i != len(strings) - 1:  #Wenn nicht die letzte Schleife
            file.write('\t')
    return file

Recommended Posts

[Python-Scraping] Geben Sie die URL und den Titel der Site mit einem bestimmten Schlüsselwort in eine Textdatei ein
[Python] Ändern Sie die Textfarbe und Hintergrundfarbe eines bestimmten Schlüsselworts in der Druckausgabe
[Python] Kombinieren von Listen mit Zahlen zu Zeichenfolgen und Schreiben in eine Ausgabedatei
[Python] Ich habe einen Web-Scraping-Code erstellt, der automatisch den Nachrichtentitel und die URL von Nihon Keizai Shimbun erfasst.
Ich möchte Tag-Informationen (Titel und Künstler) einer Musikdatei (flac, wav) extrahieren.
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
Ausgabe in Form eines Python-Arrays
Berücksichtigung der Stärken und Schwächen von Python
Verschiedene Möglichkeiten, die letzte Zeile einer CSV-Datei in Python zu lesen
So zählen Sie die Anzahl der Elemente in Django und geben sie in die Vorlage aus
Erstellen Sie eine Python-Umgebung, um die Theorie und Implementierung von Deep Learning zu erlernen
Python-Memorandum: Lesen Sie den Text und bearbeiten Sie den Dateinamen, während Sie die Zieldatei kopieren
[Python-Selen] CSV-Ausgabe Titel und URL nach dem Scraping der Google-Suchergebnisse
<Python> Ein Quiz zum Batch-Konvertieren von Dateinamen, die durch eine bestimmte Zeichenfolge als Teil des Dateinamens getrennt sind
Vorlage des Python-Skripts zum Lesen des Inhalts der Datei
Ermitteln und verarbeiten Sie die Codierung der Textdatei automatisch
Erstellt ein Modul zur Überwachung von Datei- und URL-Aktualisierungen
Option [Python] zum Deaktivieren der Ausgabe von click.progressbar
Geben Sie für jede Datei die angegebene Tabelle der Oracle-Datenbank in Python in Excel aus
Geben Sie das Ausgabeergebnis von sklearn.metrics.classification_report als CSV-Datei aus
Geben Sie einen Binärspeicherauszug in Binärdatei und zurück in eine Binärdatei aus
Die Website von "The Hitchhiker's Guide to Python" wurde vollständig übersetzt.
Python Hinweis: Das Rätsel, einer Variablen eine Variable zuzuweisen
[Python] Lassen Sie uns die URL der Django-Administrator-Site ändern
Python - Lesen Sie Daten aus einer numerischen Datendatei, um die verteilte, gemeinsam verteilte Matrix, Eigenwerte und Eigenvektoren zu finden
Ruft den Wert eines bestimmten Schlüssels bis zum angegebenen Index der Wörterbuchliste in Python ab
Rufen Sie die Excel-Liste rekursiv in einem bestimmten Ordner mit Python ab und schreiben Sie sie in Excel.
Extrahieren Sie nur den Klang eines bestimmten Instruments aus der MIDI-Datei und machen Sie es zu einer separaten Datei
Wie man einen bestimmten Prozess am Anfang und Ende der Spinne mit Scrapy einfügt
[Python] Ein Programm, um die Anzahl der Äpfel und Orangen zu ermitteln, die geerntet werden können
[Sublime Text 2] Führen Sie immer eine bestimmte Datei im Projekt aus
[Python] Ändern Sie den Namen der Bilddatei in eine Seriennummer
Holen Sie sich die Anzahl der spezifischen Elemente in der Python-Liste
Erkennen Sie mit Python Objekte einer bestimmten Farbe und Größe
[Hinweis] Import von Dateien in das übergeordnete Verzeichnis in Python
Erstellen Sie eine Python-Umgebung und übertragen Sie Daten auf den Server
Ich möchte die Natur von Python und Pip kennenlernen
[Python] So geben Sie eine Pandas-Tabelle in eine Excel-Datei aus
Eine Geschichte über das Schreiben von AWS Lambda und ein wenig Abhängigkeit von den Standardwerten von Python-Argumenten
[Python] So kratzen Sie eine lokale HTML-Datei und geben sie mit Beautiful Soup als CSV aus
[Python] Die Rolle des Sterns vor der Variablen. Teilen Sie den Eingabewert und weisen Sie ihn einer Variablen zu
Ich möchte die Frage nach der Methode "__init__" und dem Argument "self" der Python-Klasse klären.
Geben Sie die in S3 Bucket enthaltene Schlüsselliste in eine Datei aus
So bestimmen Sie die Existenz eines Selenelements in Python
[Python] So erzwingen Sie, dass eine Methode einer Unterklasse einen bestimmten Prozess ausführt
[Einführung in Python] Ich habe die Namenskonventionen von C # und Python verglichen.
Erstellen Sie ein Shell-Skript, um die Python-Datei mehrmals auszuführen
[Python] So erhalten Sie den ersten und den letzten Tag des Monats
Ich möchte den Anfang des nächsten Monats mit Python ausgeben
Geben Sie den Inhalt von ~ .xlsx im Ordner mit Python in HTML aus
Lesen Sie die Standardausgabe eines Unterprozesses zeilenweise in Python
Geben Sie die Zeile mit der angegebenen Zeichenfolge aus der Textdatei aus
So überprüfen Sie die Speichergröße eines Wörterbuchs in Python
[Python3] Definition eines Dekorators, der die Ausführungszeit einer Funktion misst
Geben Sie die Ergebnisse der Nachsuche mithilfe der Mattermost-API in eine Datei aus
Die Idee, die Konfigurationsdatei mit einer Python-Datei anstelle von yaml zu füttern
Konvertieren Sie das Ergebnis von Python Optparse, um es zu diktieren und zu verwenden
[Python] Ein Hinweis, dass ich das Verhalten von matplotlib.pyplot zu verstehen begann