[PYTHON] Raclons un site dynamique avec Docker

introduction

Ceci est l'article sur le 13ème jour du calendrier de l'Avent de l'Université de Kinki 2019.

Tout d'abord, il est important de noter que le scraping est fondamentalement un dernier recours qui ne devrait pas être fait si vous n'en avez pas besoin. Cette fois, je récupère le classement des tags de Qiita, mais Qiita a une API et j'obtiens le classement des tags. J'ai fait du scraping car il n'y avait pas d'API à faire (au 8 décembre 2019). Si vous pouvez obtenir les informations que vous voulez en utilisant l'API, récupérez-les avec l'API. De plus, lors du scraping, attendez au moment de la connexion Mettons du temps de côté et accordons du temps pour la connexion.

Les choses nécessaires

Docker

La version que j'utilise est la suivante. Docker version 19.03.5, build 633a0ea

docker-compose.yml

docekr-compsoe.yml


version: '3'

services:
    selenium-hub:
        image: selenium/hub
        container_name: selenium-hub
        ports:
          - "4444:4444"
      
    chrome:
        image: selenium/node-chrome-debug
        depends_on:
          - selenium-hub
        environment:
          - HUB_PORT_4444_TCP_ADDR=selenium-hub 
          - HUB_PORT_4444_TCP_PORT=4444
    
    python:
        build: .
        container_name: python
        volumes: 
            - .:/workspace
        command: /bin/bash
        tty: true
        stdin_open: true
FROM python:3.7
WORKDIR /workspace

RUN pip install \
    selenium \
    beautifulsoup4

dockerfile et rédiger une description

Je n'écrirai plus ce qui est un fichier dokcer-compose ou docker, donc si vous ne comprenez pas j'ai essayé d'utiliser Phoenix et PostgreSQL d'Elixir sur Docker Veuillez vous y référer car il est écrit en détail dans.

Commençons par docker-compose.yml.

Je pense que l'option de base Selenium est maintenant pour gratter les sites dynamiques.

Créez un conteneur avec les images selenium / hub et selenium / node-chrome-debug. Ici, «environnement» est défini dans «sélénium / node-chrome-debug». Veuillez noter que vous ne pouvez pas gratter sans cela.

Le Dockerfile construit l'environnement python. La commande RUN est utilisée pour télécharger les bibliothèques nécessaires.

Placez ces fichiers et le code en dessous au même niveau et exécutez docker-compose up -d --build pour lancer le conteneur.

Exemple de code

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from bs4 import BeautifulSoup
import pprint

class QiitaGetRanking():
    """
Classe pour obtenir les données de classement de Qiita.
    """

    def get_tag_ranking(self, browser: webdriver) -> dict:
        """
Fonction pour obtenir des informations sur le classement des tags de Qiita.
        
        Parameters
        ----------
        browser: webdrive
Objet Webdriver pour le scraping
        
        Returns
        -------
        tag_ranking_data: dict
Objet dictionnaire contenant le classement des balises.
        """
        html = browser.page_source.encode('utf-8')
        soup = BeautifulSoup(html, "html.parser")
        ra_tag_names = soup.find_all(class_='ra-Tag_name pr-1')
        tag_ranking_data = {}
        for i, ra_tag_name in enumerate(ra_tag_names):
            tag_ranking_data[i+1] = [ra_tag_name.text, 
            'https://qiita.com/tags/%s'%(ra_tag_name.text.lower())]
        return tag_ranking_data

if __name__ == "__main__":
    """
déclaration principale.le navigateur doit être fermé dès que l'acquisition html est terminée.La même chose s'applique lorsqu'une erreur survient.
    """
    
    try:
        browser = webdriver.Remote(
            command_executor='http://selenium-hub:4444/wd/hub',
            desired_capabilities=DesiredCapabilities.CHROME)
        print("start scrape")
        browser.get('https://qiita.com')
        #Attendez que tout le javascript soit chargé.Jugement de timeout si la lecture ne se termine pas même après 15 secondes.
        WebDriverWait(browser, 15).until(EC.presence_of_all_elements_located)
        print("generate object")
        qgr = QiitaGetRanking()
        ranking_data = qgr.get_tag_ranking(browser)
        browser.close()
        browser.quit()
        pprint.pprint(ranking_data)
    except:
        browser.close()
        browser.quit()

Je pense que le code est assez simple: lors du scraping avec docker, la construction d'un serveur sélénium et le scraping sont plus faciles et plus légers que la création d'un environnement sélénium sur ubuntu.

Pour webdrriver.Remote, reportez-vous à 2.5. Utilisation de Selenium avec Remote WebDriver. S'il vous plaît essayez.

Résultat d'exécution

Assurez-vous que vous avez 3 conteneurs dans docker ps, puis exécutez le programme dans docker exec -it python python qiita.py.

start scrape
generate object
{1: ['Python', 'https://qiita.com/tags/python'],
 2: ['JavaScript', 'https://qiita.com/tags/javascript'],
 3: ['AWS', 'https://qiita.com/tags/aws'],
 4: ['Rails', 'https://qiita.com/tags/rails'],
 5: ['Ruby', 'https://qiita.com/tags/ruby'],
 6: ['Débutant', 'https://qiita.com/tags/Débutant'],
 7: ['Docker', 'https://qiita.com/tags/docker'],
 8: ['PHP', 'https://qiita.com/tags/php'],
 9: ['Vue.js', 'https://qiita.com/tags/vue.js'],
 10: ['Go', 'https://qiita.com/tags/go']}

S'il est affiché comme ça, c'est une victoire totale, merci pour votre travail acharné.

à la fin

Cette fois, je vous ai montré comment gratter un site dynamique à l'aide de Docker. Profitons du scraping dans les limites!

Recommended Posts

Raclons un site dynamique avec Docker
Créer un serveur Flask avec Docker
Créer un fichier deb avec Docker
Déployer l'application Django avec Docker
Faisons une rupture de bloc avec wxPython
Django Tips-Créez un site de classement avec Django-
Faisons un graphe avec python! !!
Faisons un spacon avec xCAT
Faisons un jeu de shiritori avec Python
Configurer un serveur Samba avec Docker
Créons un groupe gratuit avec Python
Essayons gRPC avec Go et Docker
Obtenez un environnement local pour DynamoDB avec Docker
Faisons la voix lentement avec Python
Faisons un langage simple avec PLY 1
[Linux] Créer un environnement Jenkins avec Docker
Faisons un site multilingue en utilisant flask-babel
Exécutez une application Web Python avec Docker
Créez un framework Web avec Python! (1)
Créer un service Web avec Docker + Flask
Faisons une IA à trois yeux avec Pylearn 2
Faisons un bot Twitter avec Python!
Créez un framework Web avec Python! (2)
[Linux] Construction de l'environnement Docker avec Amazon Linux 2
[Piyopiyokai # 1] Jouons avec Lambda: création d'une fonction Lambda
Démarrez un serveur Web Python simple avec Docker
Remplaçons UWSC par Python (5) Faisons un robot
Accéder à un site avec l'authentification par certificat client avec les demandes
J'ai créé un serveur syslog prêt à l'emploi avec Play with Docker
[Jouons avec Python] Créer un livre de comptes de ménage
Lancer une application Web Python sur Nginx + Gunicorn avec Docker
Sentons-nous comme un chercheur en matériaux avec l'apprentissage automatique
Facilitons un peu la gestion des dépendances avec pip
Créer une couche pour AWS Lambda Python dans Docker
Créons une application Mac avec Tkinter et py2app
Essayez de créer une grille sphérique avec Rhinoceros / Grasshopper / GHPython
[Piyopiyokai # 1] Jouons avec Lambda: créez un compte Twitter
Un mémo sur la création d'une application Django (Python) avec Docker
Lancer Django sur un conteneur Docker à l'aide de docker-compose up
Créez un environnement de développement avec Poetry Django Docker Pycharm
[Piyopiyokai # 1] Jouons avec Lambda: création d'un script Python
[Super facile] Faisons un LINE BOT avec Python.
[Linux] Créez un auto-certificat avec Docker et apache
Serveur TFTP avec Docker
Format A4 avec python-pptx
Utiliser python avec docker
Serveur proxy avec Docker
Bonjour le monde avec Docker
Transportez un conteneur Docker
Analyse dynamique par Valgrind
Décorer avec un décorateur
Créons un client de socket Web avec Python. (Authentification par jeton d'accès)
Créez un environnement de développement Django avec Docker! (Docker-compose / Django / postgreSQL / nginx)
[Memo] Construire un environnement de développement pour Django + Nuxt.js avec Docker
Nostalgique, reproduisons un jeu de personnages comme CBM-3032 avec ncursesw.
Créons un script qui s'enregistre avec Ideone.com en Python.
Créons un diagramme PRML avec Python, Numpy et matplotlib.
[Django] Créez rapidement un environnement de développement de conteneur Django (Docker) avec PyCharm
Créons un environnement Docker qui stocke les informations de tendance Qiita!
Créez un environnement de développement Python simple avec VSCode et Docker Desktop
Créer une application Todo avec Django ① Créer un environnement avec Docker