Pratiquer le web scraping avec Python et Selenium

introduction

Cette fois, j'aimerais faire du web scraping en utilisant Python et Selenium, que j'étudie actuellement. Le site cible est Google, qui recherche avec le mot-clé spécifié, acquiert le nombre spécifié d'éléments et écrit les trois éléments "titre, URL et résumé" dans la base de données.

Obtenez les éléments suivants. sele_01.png Le but ultime est d'écrire les informations dans la base de données SQLite. sele_02.png

Environnement de développement

Utilisez Python 3.7.1. L'environnement de développement est Visual Studio 2019. J'ai téléchargé le pilote pour Firefox depuis geckodriver.

code

Le code source est le suivant. ** Veuillez noter que le code ci-dessous fonctionne à partir du "23 avril 2020", mais il peut ne pas fonctionner en raison de changements dans les spécifications du site à l'avenir. ** **

google.py


import urllib.parse
import records
from selenium.webdriver import Firefox, FirefoxOptions
from sqlalchemy.exc import IntegrityError

#Rechercher à l'aide des mots-clés suivants
keywd = ['Python','Apprentissage automatique']

#Le nom du fichier qui enregistre les données récupérées
db = records.Database('sqlite:///google_search.db')

db.query('''CREATE TABLE IF NOT EXISTS items (
            url text PRIMARY KEY,
            title text,
            summary text NULL)''')

def store_data(url, title, summary):
    try:
        db.query('''INSERT INTO items (url, title, summary)
                    VALUES (:url, :title, :summary)''', 
                    url=url, title=title, summary=summary)
    except IntegrityError:
        #Ignorer cet élément car il existe déjà
        print("it's already exist.")
        return False

    return True

def visit_next_page(driver, url):
    driver.get(url)

    items = driver.find_elements_by_css_selector('#rso > div.g')

    for item in items:
        tag = item.find_element_by_css_selector('div.r > a')
        link = tag.get_attribute('href')
        title = tag.find_element_by_tag_name('h3').text.strip()

        summary = item.find_element_by_css_selector('div.s span.st').text.strip()

        if store_data(link, title, summary):
            print(title, link, sep='\n', end='\n\n')

def main():
    #Site cible et nombre de recherches (recherche_unit * search_loop)
    base_url = "https://www.google.co.jp/"
    search_unit = 20 #Nombre d'éléments affichés sur une page (il semble impossible de spécifier 100 ou plus)
    search_loop = 5
    start = 0

    #Combinez les mots-clés en une seule chaîne
    target = ' '.join(keywd)

    #Encodage URL (l'encodage par défaut est"utf-8")
    target = urllib.parse.quote(target)

    opt = FirefoxOptions()
    
    #Si vous souhaitez observer vous-même le comportement du navigateur, veuillez commenter
    opt.add_argument('-headless')
    driver = Firefox(options=opt)

    #Réglez le temps d'attente
    driver.implicitly_wait(10)

    #Lire page par page
    for i in range(search_loop):
        url = "{0}search?num={1}&start={2}&q={3}".format(base_url, search_unit, start, target)
        start += search_unit

        print("\npage count: {0}...".format(i + 1), end='\n\n')
        visit_next_page(driver, url)

    driver.quit()

if __name__ == '__main__':
    main()

Commentaire

Comme vous pouvez le voir dans les commentaires dans la source, je vais vous expliquer la partie centrale du grattage.

La partie qui contient les données pour un cas est la suivante. sele_03.png Obtenez ceci avec un code comme celui-ci:

items = driver.find_elements_by_css_selector('#rso > div.g')

L'URL du titre et du lien est la suivante. sele_04.png La partie de contour est la suivante. sele_05.png

Obtenez ceci avec un code comme celui-ci:

tag = item.find_element_by_css_selector('div.r > a')
link = tag.get_attribute('href')
title = tag.find_element_by_tag_name('h3').text.strip()

summary = item.find_element_by_css_selector('div.s span.st').text.strip()

Comment utiliser

Lorsque vous l'utilisez réellement, spécifiez le mot-clé que vous souhaitez rechercher et le nom du fichier à enregistrer au début du code source.

#Rechercher à l'aide des mots-clés suivants
keywd = ['Python', 'Apprentissage automatique']

#Le nom du fichier qui enregistre les données récupérées
db = records.Database('sqlite:///google_search.db')

De plus, même si le même programme est exécuté plusieurs fois, la même URL sera ignorée sans être enregistrée.

def store_data(url, title, summary):
    try:
        db.query('''INSERT INTO items (url, title, summary)
                    VALUES (:url, :title, :summary)''', 
                    url=url, title=title, summary=summary)
    except IntegrityError:
        #Ignorer cet élément car il existe déjà
        print("it's already exist.")
        return False

    return True

Supplément

Au début, je pensais obtenir environ 1000 éléments sur une seule page, mais il semble que la limite soit d'environ 100 éléments par page selon les spécifications de Google. C'est pourquoi je racle en passant à la page suivante en utilisant deux variables, search_unit et search_loop.

Aussi, pourquoi ne pas utiliser Beautiful Soup? Cependant, je voulais m'entraîner à utiliser Selenium, et comme il existe de nombreux sites qui utilisent JavaScript ces jours-ci, il semble qu'il y aura plus d'opportunités d'utiliser Selenium, donc cette fois en grattant avec cette méthode J'ai essayé de.

À la fin

Vous êtes libre d'utiliser le code source introduit cette fois, mais veuillez le faire à vos propres risques.

Articles de référence, ouvrages de référence

[Bases et pratique du grattage Python / Seppe vanden Broucke et al.](Https://www.amazon.co.jp/Python%E3%82%B9%E3%82%AF%E3%83%AC%E3%82% A4% E3% 83% 94% E3% 83% B3% E3% 82% B0% E3% 81% AE% E5% 9F% BA% E6% 9C% AC% E3% 81% A8% E5% AE% 9F% E8% B7% B5-% E3% 83% 87% E3% 83% BC% E3% 82% BF% E3% 82% B5% E3% 82% A4% E3% 82% A8% E3% 83% B3% E3 % 83% 86% E3% 82% A3% E3% 82% B9% E3% 83% 88% E3% 81% AE% E3% 81% 9F% E3% 82% 81% E3% 81% AEWeb% E3% 83 % 87% E3% 83% BC% E3% 82% BF% E5% 8F% 8E% E9% 9B% 86% E8% A1% 93-impress-top-gear / dp / 4295005282 / ref = tmm_pap_swatch_0? _Encoding = UTF8 & qid = 1587624962 & sr = 1-1)

Recommended Posts

Pratiquer le web scraping avec Python et Selenium
Grattage avec Python, Selenium et Chromedriver
Grattage avec du sélénium [Python]
Premiers pas avec Python Web Scraping Practice
Premiers pas avec Python Web Scraping Practice
Scraping Web facile avec Python et Ruby
Grattage au sélénium en Python
J'ai essayé le web scraping en utilisant python et sélénium
Grattage avec du sélénium en Python
Web scraping avec Selenium (Python)
Grattage avec Selenium + Python Partie 2
Web scraping débutant avec python
Scraping avec Selenium en Python (Basic)
Web scraping avec Python Première étape
J'ai essayé webScraping avec python.
Grattage avec Python et belle soupe
Grattage au sélénium
Grattage au sélénium ~ 2 ~
Grattage avec du sélénium
Exploration Web, scraping Web, acquisition de caractères et sauvegarde d'image avec python
Grattage WEB avec Python (pour mémo personnel)
Site de courses de chevaux Web scraping avec Python
[python] Lisez le fichier html et entraînez-vous au scraping
[Pour les débutants] Essayez le web scraping avec Python
Grattage réussi avec Selenium
Grattage en Python (préparation)
Essayez de gratter avec Python.
Grattage avec Python + PhantomJS
ScreenShot avec Selenium (édition Python)
Scraping avec Python + PyQuery
Scraping RSS avec Python
Exécutez régulièrement le scraping WEB avec AWS-Lambda + Python + Cron
Grattage de la nourriture avec python et sortie en CSV
Essayez d'exécuter Google Chrome avec Python et Selenium
Faites glisser et déposez un fichier local avec Selenium (Python)
Lancer un serveur Web avec Python et Flask
Web scraping avec Python (prévisions météo)
Web scraping avec Python (cours de l'action)
Programmation avec Python et Tkinter
J'ai essayé de gratter avec Python
Chiffrement et déchiffrement avec Python
Analyse de données pour améliorer POG 1 ~ Web scraping avec Python ~
Grattage avec chromedriver en python
Grattage festif avec Python, scrapy
Enregistrez des images avec le web scraping
Python: travailler avec Firefox avec du sélénium
Analyser et visualiser JSON (application Web ⑤ avec Python + Flask)
Technologie de grattage WEB et préoccupations
Suivi automatique sur Twitter avec python et sélénium! (RPA)
Scrapage Web rapide avec Python (tout en prenant en charge le chargement JavaScript)
J'étais accro au grattage avec Selenium (+ Python) en 2020
Grattage Web facile avec Scrapy
Grattage avec Tor en Python
API Web avec Python + Falcon
Les débutants en Python sont bloqués dans leur premier scraping Web
WEB grattage avec python et essayez de créer un nuage de mots à partir des critiques
Scraping prévisions météorologiques avec python