[PYTHON] Scraping de pages i-Town: je voulais prendre la place de Wise-kun

Contexte

Excel a appelé Kenshakun pour obtenir de manière exhaustive des informations spécifiques sur i Town Page La macro a été distribuée, mais elle ne peut plus être utilisée en raison d'un changement de spécification du côté de la page i-town en novembre 2019. Ainsi, comme pratique du grattage, un débutant en Python (un peu touché lors d'une conférence universitaire) a défié la programmation avec un soupir de souffle. Le but ultime est "d'obtenir le nom / l'adresse / la catégorie du magasin à partir d'une petite catégorie spécifique".

Confirmation des conditions

Bien qu'il s'agisse d'un accord de page de ville, les deux points suivants sont interdits. ・ Actes qui ont un grand impact sur le service de la page i-town ・ Le fait d'accéder à plusieurs reprises à la page i-town à l'aide d'un programme qui accède automatiquement https://itp.ne.jp/guide/web/notice/ Cette fois, c'est un putain de code qui appuie juste sur le bouton pour charger la suite de la page vers le bas, donc je suppose que c'est dans la catégorie d'utilisation normale plutôt que d'accès répété (Si ce n'est pas possible, vous ne pouvez pas atteindre le bas même en utilisation normale spécification……).

environnement

code

Installation de sélénium

Sur l'invite Anaconda

pip install selenium

Spécification du pilote ・ Démarrage de Chrome

driver = webdriver.Chrome(executable_path='/Users/*****/*****/Selenium/chromedriver/chromedriver.exe')
driver.get('https://itp.ne.jp/genre/?area=13&genre=13&subgenre=177&sort=01&sbmap=false')

Après avoir spécifié le pilote, lancez l'URL spécifiée dans le navigateur. Cette fois, j'ai cherché dans la boutique pachinko, c'est donc l'URL lors de la recherche dans la zone "Tokyo" et la catégorie "jeu en salle".

Afficher à la ligne du bas

while True:
    try:
        driver.find_element_by_class_name('m-read-more__text').click()
    except:
        print('☆ "Plus d'affichage" fin des hits répétés ☆')
        break

Appuyez sur le bouton "Afficher plus" à plusieurs reprises jusqu'à ce que vous obteniez une erreur (= à la ligne du bas). Cela affichera toutes les informations du magasin de hits sur HTML.

Recueillir le nom de la catégorie

elist = []
elems = driver.find_elements_by_class_name("m-article-card__header__category")
for e in elems:
     elist.append(e.text)
print(elist)

str_ = '\n'.join(elist)
print(str_)
with open("str_.txt",'w')as f:
    f.write(str_)

Créez une liste vide et lancez le innerText de l'élément dont le nom de classe est m-article-card__header__category. Après cela, la liste est convertie en phrases avec des sauts de ligne un élément à la fois et sortie sous forme de texte.

la fin

flist = []
elems2 = driver.find_elements_by_class_name("m-article-card__header__title__link")
for f in elems2:
     flist.append(f.text)
print(flist)

str2_ = '\n'.join(flist)
print(str2_)
with open("str2_.txt",'w')as f:
    f.write(str2_)


glist = []
elems3 = elems2 = driver.find_elements_by_class_name("m-article-card__lead__caption")
for g in elems3:
     glist.append(g.text)
print(glist)

str3_ = '\n'.join(glist)
print(str3_)
with open("str3_.txt",'w')as f:
    f.write(str3_)


print('Succès')
driver.quit()

Le titre et la légende (adresse, numéro de téléphone, station la plus proche) sont également émis de la même manière.

Où ça se coince

Où il a été résolu

・ Oubliez d'ajouter: (deux-points) après pour ・ Je ne sais pas comment le répéter indéfiniment → Bien que vrai: c'était le cas. Je suis resté coincé même quand True a commencé par une majuscule ・ Je ne sais pas écrire dans un fichier → La cause était que le nom du fichier n'était pas entre "" ・ Je ne sais pas comment spécifier l'emplacement de chromeDriver → Je n'ai spécifié que le dossier contenant le pilote Chrome. Bien sûr, spécifiez Chromedriver.exe -Même si pip install selenium est exécuté à l'invite de commande, il ne peut pas être exécuté sur Spyder. → Doit être exécuté du côté Anaconda Prompt ...... Beaucoup d'autres

Les questions non résolues

・ Je ne sais pas ce qu'est pip ・ Je ne comprends pas la structure du html → Je n'ai pas compris après tout, j'ai donc décidé de lancer le navigateur avec Selenium ・ En plus de [Adresse], [Numéro de téléphone] et [Station la plus proche] sont inclus. → C'est assez fatal, et il est probablement préférable d'écrire un magasin en tant que groupe (cette fois, il a été traité par Excel). Je prévois de le réécrire si nécessaire pour de bon

Autre

・ L'URL pour afficher tous les magasins du pays est https://itp.ne.jp/genre/ ・ L'URL pour afficher les magasins à Tokyo est https://itp.ne.jp/genre/?area=13

PostScript 20/12/2019

J'ai remarqué qu'il est plus facile de formater en collectant par magasin avec class = "o-result-article-list__item" au lieu de collecter par catégorie, titre et adresse.

Recommended Posts

Scraping de pages i-Town: je voulais prendre la place de Wise-kun
Gratter la page i-town avec du sélénium
Chaîne de hachage que je voulais éviter (2)
Je voulais faire évoluer cGAN vers ACGAN
Chaîne de hachage que je voulais éviter (1)
Je voulais résoudre ABC160 avec Python
Je voulais résoudre ABC159 avec Python
Je voulais résoudre ABC172 avec Python
Je voulais vraiment copier avec du sélénium
Implémentation de DQN avec TensorFlow (je voulais ...)
J'ai essayé Web Scraping pour analyser les paroles.
Je voulais résoudre NOMURA Contest 2020 avec Python
J'ai essayé d'obtenir une image en grattant
Je voulais jouer avec la courbe de Bézier
Je voulais installer Python 3.4.3 avec Homebrew + pyenv
Je souhaite vendre les produits que j'ai listés par python scraping Mercari
Je voulais juste comprendre le module Pickle de Python
J'ai essayé de gratter
Je voulais aussi vérifier les indices de type avec numpy
Je voulais utiliser la bibliothèque Python de MATLAB
J'étais accro au grattage avec Selenium (+ Python) en 2020
[Échec] Je voulais générer des phrases en utilisant TextRegressor de Flair
Une histoire sur la volonté de modifier un peu le site d'administration de Django