[Python, Selenium, PhantomJS] Eine Geschichte beim Scrapen einer Website mit fauler Last

Guten Abend, ich schreibe, während ich mir Amazon Prime's Batcheller Japan anschaue, aber ich möchte auch ausgeraubt werden.

Plötzlich musste ich bei meiner Datenanalyse Daten von außen sammeln, also kratzte ich sie. Ich hatte ein kleines Problem mit der Website mit Lazy Load, daher werde ich diesen Teil vorerst als Memorandum zusammenfassen. Es war ziemlich schwer herauszufinden.

Die Umgebung ist wie folgt.

macOS 10.2.3
python 3.6.0
phantomjs 2.1.1
selenium 3.0.2

Lazy Load-Verarbeitung

Ich bin in letzter Zeit süchtig nach Anime und habe mich daher entschlossen, das Anime-Genre aus dem d Anime Store zum Üben zu holen.

lazy_load_scrape.py



import lxml.html as lh
import requests as rq
import cssselect
from selenium import webdriver
import time

#Zeit zu warten, bis die träge Ladung geladen ist
pause = 5


#Holen Sie sich root
t_url = 'https://anime.dmkt-sp.jp/animestore/gen_sel_pc'
t_html = rq.get(turl).text
root = lh.fromstring(t_html)

#Holen Sie sich Genre-Text und Links
ls = []
for i in root.cssselect('.btnList > a'):
    ls.append({'genre': i.text_content(), 'https://anime.dmkt-sp.jp/animestore' + i.attrib['href']})

#Aktuelle ls
# [{'genre': '\nSF/Fantasie(733)\n\n', 'child_url': 'https://anime.dmkt-sp.jp/animestore/gen_pc?genreCd=11'}, {'genre': '\n Roboter/Mecha(214)\n\n', 'child_url': 'https://anime.dmkt-sp.jp/animestore/gen_pc?genreCd=12'}, {'genre': '\n Aktion/Schlacht(606)\n\n', 'child_url': 'https://anime.dmkt-sp.jp/animestore/gen_pc?genreCd=13'}, {'genre': '\n Komödie/Gag(466)\n\n', 'child_url': 'https://anime.dmkt-sp.jp/animestore/gen_pc?genreCd=14'}, {'genre': '\n Liebe/Liebeskomödie(370)\n\n', 'child_url': 'https://anime.dmkt-sp.jp/animestore/gen_pc?genreCd=15'}, {'genre': '\n jeden Tag/Herzerwärmend(112)\n\n', 'child_url': 'https://anime.dmkt-sp.jp/animestore/gen_pc?genreCd=23'}, {'genre': '\n Sport/Wettbewerb(122)\n\n', 'child_url': 'https://anime.dmkt-sp.jp/animestore/gen_pc?genreCd=16'}, {'genre': '\n Horror/Spannung/Argumentation(160)\n\n', 'child_url': 'https://anime.dmkt-sp.jp/animestore/gen_pc?genreCd=17'}, {'genre': '\n Geschichte/Senki(75)\n\n', 'child_url': 'https://anime.dmkt-sp.jp/animestore/gen_pc?genreCd=18'}, {'genre': '\n Krieg/Militär-(55)\n\n', 'child_url': 'https://anime.dmkt-sp.jp/animestore/gen_pc?genreCd=19'}, {'genre': '\n Drama/Jugend(556)\n\n', 'child_url': 'https://anime.dmkt-sp.jp/animestore/gen_pc?genreCd=20'}, {'genre': '\n kurz(218)\n\n', 'child_url': 'https://anime.dmkt-sp.jp/animestore/gen_pc?genreCd=22'}, {'genre': '\n Bühne/Leben/etc.(87)\n\n', 'child_url': 'https://anime.dmkt-sp.jp/animestore/gen_pc?genreCd=24'}]

#Für die Anweisung, nacheinander auf einzelne untergeordnete Elemente zuzugreifen
for l in ls:
  genre = l['genre']
  c_url = l['child_url']

  #Geben Sie phantomJS für den Selentreiber an und geben Sie die URL ein
  driver = webdriver.PhantomJS()
  driver.get(curl)

  #Holen Sie sich root für untergeordnete Ressource
  croot1 = lh.fromstring(driver.page_source)

  #Holen Sie sich Elemente mit cssselect
  t_element = croot1.cssselect('.webkit2LineClamp')
  
  #Scrollen Sie nach unten, um das träge geladene Teil zu laden
  lastHeight = driver.execute_script("return document.body.scrollHeight")  #Der Teil, der bestimmt, ob gescrollt wird
  while True:
      driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")  #Runterscrollen
      
      time.sleep(pause)  #Warten Sie, bis es geladen ist

      #Der Teil, der bestimmt, ob gescrollt wird
      newHeight = driver.execute_script("return document.body.scrollHeight")
      if newHeight == lastHeight:
          break
      lastHeight = newHeight

  #Holen Sie sich root, wenn alles geladen ist
  croot = lh.fromstring(driver.page_source)

  #Geben Sie ein Element mit cssselect an
  ts = croot.cssselect('.webkit2LineClamp')

  #Speichern Sie den Titel der gewünschten Arbeit in der Liste
  c_elements = [t.text_content() for t in ts]

  #Liste der damit verbundenen Genres und Werke
  {genre: c_elements}

Auf diese Weise erhalten Sie vorerst eine Liste der Genres und Werke.

Zusammenfassung

Ich denke, die Hauptsache, von der ich abhängig bin, ist der asynchrone Teil. Wenn Sie die Höhe vor und nach dem Laden so einstellen, können Sie nach unten scrollen. Dies scheint vorerst in Ordnung zu sein.

Ich habe bestätigt, dass ich es damit bekommen kann, aber die Daten, die ich bekommen habe, können gemischt sein, außer was ich will.

Es gibt nicht viele Websites, die sich bemühen, die Genres von Anime zu unterteilen, nicht wahr? Wenn dies organisiert ist, kann es für Anime-Anfänger gut sein.

Schließlich

Während ich dies schrieb, verschwand mein hübsches Lieblingsmädchen mit einem Schlüsselbein bei Batchelor Japan. Ich werde vor Schock weinen.

Recommended Posts

[Python, Selenium, PhantomJS] Eine Geschichte beim Scrapen einer Website mit fauler Last
Scraping mit Python + PhantomJS
Schaben mit Selen [Python]
Schaben mit Selen in Python
Schaben mit Selen + Python Teil 1
Scraping mit Selen in Python
Schaben mit Selen + Python Teil 2
So laden Sie keine Bilder, wenn Sie PhantomJS mit Selen verwenden
Scraping mit Selen in Python (Basic)
Scraping mit Python, Selen und Chromedriver
Scraping von Websites mit JavaScript in Python
Versuchen Sie HTML-Scraping mit der Python-Bibliothek
Üben des Web-Scrapings mit Python und Selen
Verwenden Sie den Phantomjs-Webdriver von Selen mit Pythons Unittest
Schaben mit Selen
Schaben mit Selen ~ 2 ~
Scraping mit Python
Scraping mit Python
Schaben mit Selen
Fehler beim Installieren eines Moduls mit Python pip
[Python3] Eine Geschichte, die bei der Zeitzonenkonvertierung steckt
Eine Geschichte über den Umgang mit Binärdaten in Python
Ein Memo beim Erstellen einer Python-Umgebung mit Miniconda
Die Geschichte, wenn ein Python-Benutzer eine JSON-Datei übergibt
Einfrieren mit send_keys der Dateiauswahl beim Ausführen des Selenium Web Driver in Python [PhantomJS]
Eine Geschichte, der ich nach der SFTP-Kommunikation mit Python verfallen war
Erfolgreiches Schaben mit Selen
Scraping in Python (Vorbereitung)
Versuchen Sie es mit Python.
Die Geschichte, mit Python eine Hanon-ähnliche Partitur zu machen
Probleme beim Erstellen eines CSV-JSON-Konvertierungstools mit Python
Ich war süchtig danach, 2020 mit Selen (+ Python) zu kratzen
Eine Geschichte über das Ausprobieren eines (Golang +) Python-Monorepo mit Bazel
Screenshot mit Selen (Python Edition)
Ich habe mit Python verschiedene Dinge ausprobiert: Schaben (Beautiful Soup + Selenium + PhantomJS) und morphologische Analyse
Ein Hinweis auf Missverständnisse beim Versuch, das gesamte selbst erstellte Modul mit Python3 zu laden
Scraping mit Python + PyQuery
Scraping von RSS mit Python
Eine Geschichte, die verschwunden ist, als ich einen Pfad angegeben habe, der mit tilda (~) in Python Open beginnt
Eine Geschichte, die stolperte, als ich mit Transformer einen Chat-Chat-Bot erstellte
Empfehlung von Django, Bachstelze ~ Warum eine Website mit Python entwickeln ~
Ein Memo, wenn mit Python + OpenCV schnell ein Gesicht erkannt wird
[Python] Hinweise beim Versuch, Numpy mit Cython zu verwenden
Holen Sie sich eine Liste der mit Python + Selen gekauften DMM-E-Books
Verwenden Sie ein Makro, das beim Speichern von Python mit vscode ausgeführt wird
Eine Geschichte über einen Amateur, der mit Python (Kivy) einen Blockbruch macht ②
Eine Geschichte über einen Amateur, der mit Python (Kivy) einen Blockbruch macht ①
[Selenium] Ändern Sie das Protokollausgabeziel, wenn Sie Phantomjs mit Python3 ausführen
Eine Geschichte über einen Python-Anfänger, der mit dem No-Modul'http.server 'feststeckt.
Ich habe versucht, mit Python zu kratzen
Web Scraping mit Python + JupyterLab
Schaben mit Chromedriver in Python
Geschichte beim Iterieren des Python-Tupels
Festliches Scraping mit Python, Scrapy
Python: Arbeiten mit Firefox mit Selen
Stolpern Geschichte mit Python-Array
Scraping mit Tor in Python
Machen Sie eine Lotterie mit Python