[Python scraping] Affiche l'URL et le titre du site contenant un mot-clé spécifique dans un fichier texte

Aperçu

Si vous effectuez une recherche Google et que l'un des "title" ʻog: description`` h1~h4` de la page de résultats contient un mot-clé spécifique, le titre et l'URL de la page cible sont séparés en fichiers texte. Sortie vers. Si l'URL est déjà dans le fichier texte, ignorez le traitement.

Version Python

3.8.2

Procédure d'exécution

Après avoir créé un environnement virtuel avec venv, etc.

pip install -r requirements.txt
python main.py

code

requirements.txt

beautifulsoup4 == 4.9.1
requests == 2.24.0

settings.py

settings = {
    #Mots clés utilisés pour la recherche Google
    'google_search_keywords': ['Médical', 'couronne'],

    #Nombre de recherches
    'google_search_num': 10,

    #Mots clés à rechercher à partir de la page d'appel
    'search_keywords_in_page': ['Médical']
}

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:
    """
À partir d'une instance BeautifulSoup
    <meta property="og:description" content="...">
Et renvoie le contenu du contenu.
S'il n'est pas trouvé, renvoie un caractère vide.
    """
    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]  #Suppression de chaîne inutile
    href = urllib.parse.unquote(href)  #Décoder
    return href


def do_google_search(keywords: [str], search_num: int) -> [str]:
    """
Effectuer une recherche Google avec des mots clés
Renvoie une liste d'URL d'appel
    """
    #Effectuer une recherche Google
    url = 'https://www.google.co.jp/search'
    params = {
        'hl': 'ja',
        'num': search_num,
        'q': ' '.join(keywords)
    }
    response = requests.get(url, params=params)

    #Renvoie une liste d'URL d'appel
    # `.kCrYT`Peut nécessiter une correction en raison de modifications des spécifications Google
    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:
        #Ignorer le traitement si le fichier texte contient déjà l'URL
        if url in output_text.get_urls():
            continue

        try:
            response = requests.get(url)
            response.encoding = 'utf-8'
            response.raise_for_status()
        except:
            #Ignorer le traitement si une erreur de connexion se produit
            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')]

        #Ignorer le traitement si les mots clés ne sont pas inclus dans la page
        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

        #Écrire dans un fichier texte
        title = '**No title**' if len(titles) <= 0 else titles[0].strip().replace('\n', '')
        output_text.write(title, url)

    #Fichier texte de sortie dans un format facile à lire
    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):
    """
Ecrire une chaîne délimitée par des tabulations dans le fichier
    """
    for i, string in enumerate(strings):
        file.write(string)
        if i != len(strings) - 1:  #Sinon la dernière boucle
            file.write('\t')
    return file

Recommended Posts

[Python scraping] Affiche l'URL et le titre du site contenant un mot-clé spécifique dans un fichier texte
[Python] Changer la couleur du texte et la couleur d'arrière-plan d'un mot clé spécifique dans la sortie d'impression
[Python] Combiner des listes contenant des nombres en chaînes et les écrire dans un fichier de sortie
[Python] J'ai créé un code de scraping web qui acquiert automatiquement le titre de l'actualité et l'URL de Nihon Keizai Shimbun.
Je souhaite extraire les informations d'étiquette (titre et artiste) d'un fichier de musique (flac, wav).
J'ai fait un programme pour vérifier la taille d'un fichier avec Python
Sortie sous la forme d'un tableau python
Prise en compte des forces et faiblesses de Python
Différentes façons de lire la dernière ligne d'un fichier csv en Python
Comment compter le nombre d'éléments dans Django et sortir dans le modèle
Créez un environnement python pour apprendre la théorie et la mise en œuvre de l'apprentissage profond
Mémorandum Python: reportez-vous au texte et modifiez le nom du fichier lors de la copie du fichier cible
[Sélénium Python] Titre et URL de la sortie CSV après avoir récupéré les résultats de recherche Google
<Python> Un quiz pour convertir par lots les noms de fichiers séparés par une chaîne de caractères spécifique dans le cadre du nom de fichier
Modèle de script python pour lire le contenu du fichier
Déterminer et traiter automatiquement l'encodage du fichier texte
Création d'un module pour surveiller les mises à jour des fichiers et des URL
[python] option pour désactiver la sortie de click.progressbar
Sortie de la table spécifiée de la base de données Oracle en Python vers Excel pour chaque fichier
Afficher le résultat de sortie de sklearn.metrics.classification_report sous forme de fichier CSV
Sortie d'un vidage binaire en binaire et retour dans un fichier binaire
Entièrement traduit le site du "Guide de l'auto-stoppeur de Python"
Note Python: Le mystère de l'attribution d'une variable à une variable
[Python] Changeons l'URL du site administrateur de Django
Python --Lisez des données à partir d'un fichier de données numériques pour trouver des matrices, des valeurs propres et des vecteurs propres distribués co-distribués
Obtenir la valeur d'une clé spécifique jusqu'à l'index spécifié de la liste de dictionnaires en Python
Obtenez de manière récursive la liste Excel dans un dossier spécifique avec python et écrivez-la dans Excel.
Extraire uniquement le son d'un instrument spécifique du fichier MIDI et en faire un fichier séparé
Comment insérer un processus spécifique au début et à la fin de l'araignée avec la tremblante
[Python] Un programme pour trouver le nombre de pommes et d'oranges qui peuvent être récoltées
[Sublime Text 2] Toujours exécuter un fichier spécifique dans le projet
[python] Remplacez le nom du fichier image par un numéro de série
Obtenez le nombre d'éléments spécifiques dans la liste python
Détecter les objets d'une couleur et d'une taille spécifiques avec Python
[Note] Importation de fichiers dans le répertoire parent en Python
Créer un environnement Python et transférer des données vers le serveur
Je veux connaître la nature de Python et pip
[Python] Comment générer une table pandas dans un fichier Excel
Une histoire sur l'écriture d'AWS Lambda et de devenir un peu accro aux valeurs par défaut des arguments Python
[Python] Comment récupérer un fichier html local et le générer au format CSV à l'aide de Beautiful Soup
[Python] Le rôle de l'astérisque devant la variable. Divisez la valeur d'entrée et affectez-la à une variable
Je veux clarifier la question de la méthode "__init__" et de l'argument "self" de la classe Python.
Exporter la liste de clés incluse dans S3 Bucket dans un fichier
Comment déterminer l'existence d'un élément sélénium en Python
[Python] Comment forcer une méthode d'une sous-classe à effectuer un processus spécifique
[Introduction à Python] J'ai comparé les conventions de nommage de C # et Python.
Créez un script shell pour exécuter le fichier python plusieurs fois
[Python] Comment obtenir le premier et le dernier jour du mois
Je veux sortir le début du mois prochain avec Python
Exportez le contenu de ~ .xlsx dans le dossier en HTML avec Python
Lire la sortie standard d'un sous-processus ligne par ligne en Python
Sortie de la ligne contenant la chaîne de caractères spécifiée à partir du fichier texte
Comment vérifier la taille de la mémoire d'un dictionnaire en Python
[Python3] Définition d'un décorateur qui mesure le temps d'exécution d'une fonction
Exporter les résultats de la recherche de publication dans un fichier à l'aide de l'API Mattermost
L'idée d'alimenter le fichier de configuration avec un fichier python au lieu de yaml
Convertissez le résultat de python optparse en dict et utilisez-le
[python] Une note que j'ai commencé à comprendre le comportement de matplotlib.pyplot