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.
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
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.
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.
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.
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