[Python, Selenium, PhantomJS] Une histoire lors de la capture d'un site Web avec une charge paresseuse

Bonsoir, j'écris en regardant Batcheller Japan d'Amazon Prime, mais je veux aussi être volé.

Soudainement, dans mon travail d'analyse de données, j'avais besoin de collecter des données de l'extérieur, alors je les ai grattées. J'ai eu un petit problème avec le site Web avec Lazy Load, donc je vais résumer cette partie comme un mémorandum pour le moment. C'était assez difficile à découvrir.

L'environnement est le suivant.

macOS 10.2.3
python 3.6.0
phantomjs 2.1.1
selenium 3.0.2

Traitement Lazy Load

Je suis accro à l'anime ces derniers temps, alors j'ai décidé de me procurer le genre d'anime sur d Anime Store pour m'entraîner.

lazy_load_scrape.py



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

#Il est temps d'attendre que la charge paresseuse se charge
pause = 5


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

#Obtenez du texte et des liens de genre
ls = []
for i in root.cssselect('.btnList > a'):
    ls.append({'genre': i.text_content(), 'https://anime.dmkt-sp.jp/animestore' + i.attrib['href']})

#LS actuel
# [{'genre': '\nSF/Fantaisie(733)\n\n', 'child_url': 'https://anime.dmkt-sp.jp/animestore/gen_pc?genreCd=11'}, {'genre': '\n robot/Mecha(214)\n\n', 'child_url': 'https://anime.dmkt-sp.jp/animestore/gen_pc?genreCd=12'}, {'genre': '\n action/bataille(606)\n\n', 'child_url': 'https://anime.dmkt-sp.jp/animestore/gen_pc?genreCd=13'}, {'genre': '\n comédie/gag(466)\n\n', 'child_url': 'https://anime.dmkt-sp.jp/animestore/gen_pc?genreCd=14'}, {'genre': '\n amour/Comédie romantique(370)\n\n', 'child_url': 'https://anime.dmkt-sp.jp/animestore/gen_pc?genreCd=15'}, {'genre': '\n tous les jours/Réconfortant(112)\n\n', 'child_url': 'https://anime.dmkt-sp.jp/animestore/gen_pc?genreCd=23'}, {'genre': '\n sports/Concurrence(122)\n\n', 'child_url': 'https://anime.dmkt-sp.jp/animestore/gen_pc?genreCd=16'}, {'genre': '\n horreur/Le suspense/Raisonnement(160)\n\n', 'child_url': 'https://anime.dmkt-sp.jp/animestore/gen_pc?genreCd=17'}, {'genre': '\n histoire/Senki(75)\n\n', 'child_url': 'https://anime.dmkt-sp.jp/animestore/gen_pc?genreCd=18'}, {'genre': '\n guerre/militaire(55)\n\n', 'child_url': 'https://anime.dmkt-sp.jp/animestore/gen_pc?genreCd=19'}, {'genre': '\n drame/Jeunesse(556)\n\n', 'child_url': 'https://anime.dmkt-sp.jp/animestore/gen_pc?genreCd=20'}, {'genre': '\n court(218)\n\n', 'child_url': 'https://anime.dmkt-sp.jp/animestore/gen_pc?genreCd=22'}, {'genre': '\n étape/vivre/etc.(87)\n\n', 'child_url': 'https://anime.dmkt-sp.jp/animestore/gen_pc?genreCd=24'}]

#Pour instruction pour accéder aux éléments enfants individuels un par un
for l in ls:
  genre = l['genre']
  c_url = l['child_url']

  #Spécifiez phantomJS pour le pilote sélénium et indiquez l'URL
  driver = webdriver.PhantomJS()
  driver.get(curl)

  #Obtenir la racine de la ressource enfant
  croot1 = lh.fromstring(driver.page_source)

  #Obtenir des éléments à l'aide de cssselect
  t_element = croot1.cssselect('.webkit2LineClamp')
  
  #Faites défiler vers le bas pour charger la partie chargée paresseusement
  lastHeight = driver.execute_script("return document.body.scrollHeight")  #La partie qui détermine si elle est défilée
  while True:
      driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")  #Défiler vers le bas
      
      time.sleep(pause)  #Attendez qu'il se charge

      #La partie qui détermine si elle est défilée
      newHeight = driver.execute_script("return document.body.scrollHeight")
      if newHeight == lastHeight:
          break
      lastHeight = newHeight

  #Obtenez root lorsque tout est chargé
  croot = lh.fromstring(driver.page_source)

  #Obtenir en spécifiant un élément à l'aide de cssselect
  ts = croot.cssselect('.webkit2LineClamp')

  #Stockez le titre de l'œuvre que vous vouliez dans la liste
  c_elements = [t.text_content() for t in ts]

  #Liste des genres et des œuvres qui leur sont associés
  {genre: c_elements}

Pour le moment, cela vous donnera une liste de genres et d'œuvres.

Résumé

Je pense que la principale chose à laquelle je suis accro est la partie asynchrone. Si vous prenez la hauteur avant et après le chargement de cette façon, vous pouvez faire défiler vers le bas. Cela semble convenir pour le moment.

J'ai confirmé que je pouvais l'obtenir avec cela, mais les données que j'ai obtenues peuvent être mélangées à d'autres que je veux.

Il n'y a pas beaucoup de sites qui s'efforcent de diviser les genres d'anime, n'est-ce pas? Cela pourrait être bon pour les débutants d'anime si cela est organisé.

finalement

Pendant que j'écrivais ceci, ma jolie fille préférée avec une clavicule a disparu à Batchelor Japon. Je suis sur le point de pleurer sous le choc.

Recommended Posts

[Python, Selenium, PhantomJS] Une histoire lors de la capture d'un site Web avec une charge paresseuse
Grattage avec Python + PhantomJS
Grattage avec du sélénium [Python]
Grattage au sélénium en Python
Grattage avec Selenium + Python Partie 1
Grattage avec du sélénium en Python
Grattage avec Selenium + Python Partie 2
Comment ne pas charger d'images lors de l'utilisation de PhantomJS avec Selenium
Scraping avec Selenium en Python (Basic)
Grattage avec Python, Selenium et Chromedriver
Scraping de sites Web à l'aide de JavaScript en Python
Essayez le scraping HTML avec la bibliothèque Python
Pratiquer le web scraping avec Python et Selenium
Utilisez le pilote Web phantomjs de sélénium avec unittest de python
Grattage au sélénium
Grattage au sélénium ~ 2 ~
Grattage avec Python
Grattage avec Python
Grattage avec du sélénium
Erreur lors de l'installation d'un module avec Python pip
[Python3] Une histoire bloquée avec la conversion du fuseau horaire
Une histoire sur la gestion des données binaires en Python
Un mémo lors de la création d'un environnement python avec miniconda
L'histoire lorsqu'un utilisateur Python passe un fichier JSON
Figer avec send_keys de la sélection de fichiers lors de l'exécution du pilote Web Selenium en Python [PhantomJS]
Une histoire à laquelle j'étais accro après la communication SFTP avec python
Grattage réussi avec Selenium
Grattage en Python (préparation)
Essayez de gratter avec Python.
L'histoire de la création d'une partition de type Hanon avec Python
Problèmes lors de la création d'un outil de conversion csv-json avec python
J'étais accro au grattage avec Selenium (+ Python) en 2020
Une histoire d'essayer un monorepo (Golang +) Python avec Bazel
ScreenShot avec Selenium (édition Python)
J'ai essayé différentes choses avec Python: le grattage (Beautiful Soup + Selenium + PhantomJS) et l'analyse morphologique
Une note de malentendu lors de la tentative de chargement de l'intégralité du module self-made avec Python3
Scraping avec Python + PyQuery
Scraping RSS avec Python
Une histoire qui a disparu quand j'ai spécifié un chemin commençant par tilda (~) en python open
Une histoire qui a trébuché lorsque j'ai créé un bot de chat avec Transformer
Recommandation de django, wagtail ~ Pourquoi développer un site web avec python ~
Un mémo lorsque le visage est détecté avec Python + OpenCV rapidement
[python] Remarques lors de la tentative d'utilisation de numpy avec Cython
Obtenez une liste des livres électroniques DMM achetés avec Python + Selenium
Utilisez une macro qui s'exécute lors de l'enregistrement de python avec vscode
Une histoire sur un amateur faisant une rupture de bloc avec python (kivy) ②
Une histoire sur un amateur faisant une rupture de bloc avec python (kivy) ①
[Selenium] Changer la destination de sortie du journal lors de l'exécution de phantomjs avec python3
Une histoire à propos d'un débutant en python coincé avec aucun module nommé'ttp.server '
J'ai essayé de gratter avec Python
Web scraping avec python + JupyterLab
Grattage avec chromedriver en python
Histoire lors de l'itération d'un tuple python
Grattage festif avec Python, scrapy
Python: travailler avec Firefox avec du sélénium
Histoire de trébucher avec le tableau Python
Grattage avec Tor en Python
Faites une loterie avec Python