[PYTHON] Lassen Sie uns mit Docker eine dynamische Site kratzen

Einführung

Dies ist der Artikel am 13. Tag des Adventskalenders 2019 der Kinki University.

Zuallererst ist es wichtig zu beachten, dass das Scraping im Grunde ein letzter Ausweg ist, der nicht durchgeführt werden sollte, wenn Sie es nicht benötigen. Dieses Mal kratzte ich Qiitas Tag-Ranking, aber Qiita hat eine API und ich bekomme dort das Tag-Ranking Ich habe geschabt, weil es keine API zu tun gab (Stand: 8. Dezember 2019). Wenn Sie die gewünschten Informationen mit api erhalten können, holen Sie sie sich mit api. Warten Sie beim Schaben auch zum Zeitpunkt der Verbindung Nehmen wir uns Zeit und lassen Sie Zeit für die Verbindung.

Dinge notwendig

Docker

Die Version, die ich benutze, ist wie folgt. 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

Docker-Datei und Beschreibung verfassen

Ich werde keine Dokcer-Compose- oder Docker-Datei mehr schreiben. Wenn Sie also nicht verstehen ich habe versucht, Elixirs Phoenix und PostgreSQL auf Docker zu verwenden Bitte beziehen Sie sich darauf, da es ausführlich in geschrieben ist.

Beginnen wir mit docker-compose.yml.

Ich denke, die grundlegende Option "Selen" ist jetzt das Scrapen dynamischer Sites.

Erstellen Sie einen Container mit den Bildern "Selen / Hub" und "Selen / Node-Chrome-Debug". Hier hat "Selen / Node-Chrome-Debug" die "Umgebung" eingestellt. Bitte beachten Sie, dass Sie ohne diese Option nicht kratzen können.

Die Docker-Datei erstellt die Python-Umgebung. Mit dem Befehl RUN werden die erforderlichen Bibliotheken heruntergeladen.

Platzieren Sie diese Dateien und den folgenden Code auf derselben Ebene und führen Sie "docker-compose up -d --build" aus, um den Container zu starten.

Codebeispiel

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():
    """
Klasse, um Rangdaten von Qiita zu erhalten.
    """

    def get_tag_ranking(self, browser: webdriver) -> dict:
        """
Funktion zum Abrufen von Informationen zum Tag-Ranking von Qiita.
        
        Parameters
        ----------
        browser: webdrive
Webdriver-Objekt zum Scraping
        
        Returns
        -------
        tag_ranking_data: dict
Wörterbuchobjekt mit Tag-Rangfolge.
        """
        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__":
    """
Hauptaussage.Der Browser sollte geschlossen werden, sobald die HTML-Erfassung abgeschlossen ist.Gleiches gilt, wenn ein Fehler auftritt.
    """
    
    try:
        browser = webdriver.Remote(
            command_executor='http://selenium-hub:4444/wd/hub',
            desired_capabilities=DesiredCapabilities.CHROME)
        print("start scrape")
        browser.get('https://qiita.com')
        #Warten Sie, bis das gesamte Javascript geladen ist.Timeout-Beurteilung, wenn das Lesen auch nach 15 Sekunden nicht beendet ist.
        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()

Ich denke, der Code ist ziemlich einfach. Beim Scraping mit Docker ist das Erstellen eines Selenservers und Scraping einfacher und leichter als das Erstellen einer Seleniumumgebung auf Ubuntu.

Informationen zu webdrriver.Remote finden Sie unter 2.5. Verwenden von Selen mit Remote WebDriver. Bitte versuche.

Ausführungsergebnis

Stellen Sie sicher, dass Sie 3 Container in docker ps haben, und führen Sie das Programm in docker exec -it python python qiita.py aus.

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: ['Anfänger', 'https://qiita.com/tags/Anfänger'],
 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']}

Wenn es so angezeigt wird, ist es ein vollständiger Sieg. Vielen Dank für Ihre harte Arbeit.

schließlich

Dieses Mal habe ich Ihnen gezeigt, wie Sie eine dynamische Site mit Docker kratzen. Lassen Sie uns das Kratzen innerhalb der Grenzen genießen!

Recommended Posts

Lassen Sie uns mit Docker eine dynamische Site kratzen
Erstellen eines Flask-Servers mit Docker
Erstellen Sie eine Deb-Datei mit Docker
Stellen Sie die Django-Anwendung mit Docker bereit
Machen wir einen Blockbruch mit wxPython
Django-Tipps - Erstellen Sie eine Ranking-Site mit Django-
Lassen Sie uns ein Diagramm mit Python erstellen! !!
Machen wir mit xCAT einen Spacon
Lassen Sie uns mit Python ein Shiritori-Spiel machen
Richten Sie mit Docker einen Samba-Server ein
Erstellen wir mit Python eine kostenlose Gruppe
Versuchen wir es mit gRPC mit Go und Docker
Holen Sie sich mit Docker eine lokale Umgebung für DynamoDB
Lassen Sie uns mit Python langsam sprechen
Lassen Sie uns mit PLY 1 eine einfache Sprache erstellen
[Linux] Erstellen einer Jenkins-Umgebung mit Docker
Lassen Sie uns mit flask-babel eine mehrsprachige Site erstellen
Führen Sie eine Python-Webanwendung mit Docker aus
Erstellen Sie ein Webframework mit Python! (1)
Erstellen Sie einen Webdienst mit Docker + Flask
Machen wir mit Pylearn 2 eine dreiäugige KI
Machen wir einen Twitter-Bot mit Python!
Erstellen Sie ein Webframework mit Python! (2)
[Linux] Aufbau einer Docker-Umgebung mit Amazon Linux 2
[Piyopiyokai # 1] Spielen wir mit Lambda: Erstellen einer Lambda-Funktion
Starten Sie mit Docker einen einfachen Python-Webserver
Ersetzen wir UWSC durch Python (5) Machen wir einen Roboter
Greifen Sie mit Requests auf eine Site mit Clientzertifikatauthentifizierung zu
Ich habe mit Play with Docker einen gebrauchsfertigen Syslog-Server erstellt
[Lass uns mit Python spielen] Ein Haushaltsbuch erstellen
Starten Sie mit Docker eine Python-Webanwendung auf Nginx + Gunicorn
Fühlen wir uns wie ein Materialforscher mit maschinellem Lernen
Lassen Sie uns das Abhängigkeitsmanagement mit pip etwas einfacher machen
Erstellen Sie in Docker eine Ebene für AWS Lambda Python
Lassen Sie uns eine Mac-App mit Tkinter und py2app erstellen
Versuchen Sie, mit Rhinoceros / Grasshopper / GHPython ein sphärisches Gitter zu erstellen
[Piyopiyokai # 1] Lass uns mit Lambda spielen: Holen Sie sich einen Twitter-Account
Ein Memo zum Erstellen einer Django (Python) -Anwendung mit Docker
Starten Sie Django auf einem Docker-Container mit Docker-Compose Up
Erstellen Sie eine Entwicklungsumgebung mit Poetry Django Docker Pycharm
[Piyopiyokai # 1] Spielen wir mit Lambda: Erstellen eines Python-Skripts
[Super einfach] Machen wir einen LINE BOT mit Python.
[Linux] Erstellen Sie ein Selbstzertifikat mit Docker und Apache
TFTP-Server mit Docker
A4 Größe mit Python-Pptx
Verwenden Sie Python mit Docker
Proxyserver mit Docker
Hallo, Welt mit Docker
Tragen Sie einen Docker-Container
Dynamische Analyse von Valgrind
Mit Dekorateur dekorieren
Lassen Sie uns mit Python einen Web-Socket-Client erstellen. (Zugriffstoken-Authentifizierung)
Erstellen Sie mit Docker eine Django-Entwicklungsumgebung! (Docker-compose / Django / postgreSQL / nginx)
[Memo] Erstellen Sie mit Docker eine Entwicklungsumgebung für Django + Nuxt.js
Nostalgisch, lasst uns ein Charakterspiel wie CBM-3032 mit ncursesw reproduzieren.
Erstellen wir ein Skript, das sich bei Ideone.com in Python registriert.
Lassen Sie uns ein PRML-Diagramm mit Python, Numpy und matplotlib erstellen.
[Django] Erstellen Sie mit PyCharm schnell eine Entwicklungsumgebung für Django-Container (Docker)
Erstellen wir eine Docker-Umgebung, in der Qiita-Trendinformationen gespeichert werden!
Erstellen Sie mit VSCode & Docker Desktop eine einfache Python-Entwicklungsumgebung
Erstellen einer Todo-App mit Django ① Erstellen Sie eine Umgebung mit Docker