[PYTHON] [Selenium] Utilisez l'instruction while pour passer à plusieurs reprises à la "page suivante"

Tips

1. Traitement itératif de la transition de page par instruction While (cela fonctionne)

selenium_success.py


#Obtenez l'URL de la page suivante (deuxième page) de la première page
next_page_url = driver.find_element_by_class_name("js-next-page-link").get_attribute("href")

#Traitement en boucle de la deuxième page à la dernière page
while len(next_page_url) > 0:
	driver.get(next_page_url)
	#Définir le temps d'attente d'un élément pour charger à 10 secondes
	driver.implicitly_wait(10)
	next_page_html = driver.page_source.encode('utf-8')

#Écrivez le code d'implémentation pour n'importe quel processus ici

	next_page_url = driver.find_element_by_class_name("js-next-page-link").get_attribute("href")
else:
	print("\n\n Le traitement de la dernière page est terminé.\n\n")

2. Traitement itératif de la transition de page par l'instruction for (s'arrête au milieu)

selenium_failure.py


#Obtenez l'URL de la page suivante (deuxième page) de la première page
next_page_url = driver.find_element_by_class_name("js-next-page-link").get_attribute("href")

#Traitement en boucle de la deuxième page à la dernière page
if len(next_page_url) != 0:
	driver.get(next_page_url)
	#Définir le temps d'attente d'un élément pour charger à 10 secondes
	driver.implicitly_wait(10)
	next_page_html = driver.page_source.encode('utf-8')

#Écrivez le code d'implémentation pour n'importe quel processus ici

	next_page_url = driver.find_element_by_class_name("js-next-page-link").get_attribute("href")
else:
	print("\n\n Le traitement de la dernière page du résultat de la recherche d'article est terminé.\n\n")

Code réellement créé

selenium_python_multi_pages_while.py


# coding: utf-8
import time, argparse, datetime
from selenium import webdriver
from bs4 import BeautifulSoup
from pprint import pprint
import pandas as pd
import numpy as np
import time

###constant###
url = "http://qiita.com"

###Déclaration d'initialisation de variable###
pagenum = 0
#Recevoir des arguments de ligne de commande
parser = argparse.ArgumentParser()

#Reçoit un seul argument de ligne de commande
parser.add_argument('-word', '--search_word', default='Python', help='Veuillez spécifier le mot de recherche à saisir sur la page de recherche d'articles de Qiita.')
parser.add_argument('-max', '--max_page_num', default='50', help='S'il existe plusieurs pages applicables et que vous souhaitez définir une limite supérieure pour le nombre de pages pour lesquelles des données peuvent être acquises, spécifiez la limite supérieure.')
args = parser.parse_args()
search_word = args.search_word
num_of_search_pages = int(args.max_page_num)

print("\n\n Chaîne de recherche saisie:", args.search_word, "\n")
print("Si la page de liste d'articles s'étend sur plusieurs pages{}Le processus est arrêté jusqu'à la page.".format(num_of_search_pages))

#nom du fichier de sortie
output_file_name = str(datetime.datetime.now()) + "_Search: " + search_word

###Définition de la méthode###
def proceed_each_page(page_num, this_page_html, driver):
	from bs4 import BeautifulSoup
	this_soup = BeautifulSoup(this_page_html, 'lxml')
	print("""
	================================
		   {}Page de traitement...	
	===============================
	""".format(page_num))
	results = this_soup.find_all("h1", class_="searchResult_itemTitle")
	#Stocker les résultats dans la liste des titres d'articles
	this_page_title_list = []
	for result in results:
		title_texts = result.findAll("a")
		title_texts = str(title_texts[0]).replace("<em>", "").replace("</em>", "").split(">")[1:]
		title_texts = title_texts[0]
		pos = title_texts.find('</a')
		title_text = title_texts[:pos]
		this_page_title_list.append(title_text)

	console_message = "Sur l'écran des résultats de la recherche{}Nombre d'articles sur la page:  ".format(pagenum) + str(len(this_page_title_list)) + "\n\n"
	pprint(this_page_title_list)
	
	#Stocker les résultats dans la liste d'URL
	this_page_url_list = []
	for result in results:
		href = result.findAll("a")[0].get("href")
		this_page_url_list.append(str(url + href))

	#Stocker les contributeurs dans la liste des contributeurs
	# <div class="searchResult_header"><a href="/niiku-y">niiku-y</a>Est 2019/08/Publié dans 07</div>
	this_page_author_list = []
	
	results = this_soup.findAll(class_="searchResult_header")
	for result in results:
		author = result.findAll("a")[0].get("href")
		author = author.replace("/", "")
		this_page_author_list.append(author)

	#Enregistrer les données que l'article a été obtenu à partir de la nième page
	this_page_num_list = [page_num]*len(this_page_title_list)

	##Obtenez une capture d'écran de la nième page de l'écran des résultats de la recherche
	#Obtenez des données de taille verticale et horizontale de l'écran
	w = driver.execute_script("return document.body.scrollWidth;")
	h = driver.execute_script("return document.body.scrollHeight;")
	driver.set_window_size(w,h)
	#Spécifiez l'emplacement d'enregistrement et le nom de fichier du fichier de capture d'écran (fichier image)
	FILENAME = "./{search_word}_page{number}_screen_{datetime}.png ".format(search_word=search_word, number=page_num, datetime=str(datetime.datetime.now()))  
	#Enregistrer l'image
	driver.save_screenshot(FILENAME)
	
	#Renvoie chaque liste contenant des informations sur la page Web traitée
	return [this_page_num_list, this_page_author_list, this_page_title_list, this_page_url_list, driver]

###Fin de la définition de la méthode

###traitement principal
driver = webdriver.Chrome()

#Accédez à la page d'accueil de Qiita
driver.get(url)

#Entrez un mot-clé dans la zone de recherche d'article
search = driver.find_element_by_class_name("st-Header_searchInput")
search.send_keys(search_word)
search.submit()
time.sleep(5)

#Obtenez le HTML de la première page de la page de liste d'articles des résultats de recherche
first_page_html = driver.page_source.encode('utf-8')

#Traiter la première page
page_num = 1
all_page_num_list = []
all_page_author_list = []
all_page_title_list = []
all_page_url_list = []

this_page_num_list, this_page_author_list, this_page_title_list, this_page_url_list, driver = proceed_each_page(page_num, first_page_html, driver)

all_page_num_list = all_page_num_list + this_page_num_list
all_page_author_list = all_page_author_list + this_page_author_list
all_page_title_list = all_page_title_list + this_page_title_list
all_page_url_list = all_page_url_list + this_page_url_list

#Si la page Web reçue à indiquer par le pilote a la page suivante, passez à la page suivante.
# next_page_La valeur de retour de url est de type liste. Si la balise ci-dessus avec la page suivante n'est pas présente, une liste vide est renvoyée
next_page_url = driver.find_element_by_class_name("js-next-page-link").get_attribute("href")
print("=======")
print(type(next_page_url))
print("=======")

#À partir de la deuxième page(Dernière page ou{num_of_search_pages}Le plus petit numéro de page jusqu'à la page)Traitement en boucle jusqu'à
# (num_of_search_pages)Pour faire de la page la dernière page{num_of_search_pages -1)Tournez la page suivante
while len(next_page_url) > 0 and page_num <= (num_of_search_pages - 1):
	driver.get(next_page_url)
	#Définir le temps d'attente d'un élément pour charger à 10 secondes
	driver.implicitly_wait(10)
	#time.sleep(5)
	next_page_html = driver.page_source.encode('utf-8')
	page_num += 1
	this_page_num_list, this_page_author_list, this_page_title_list, this_page_url_list, driver = proceed_each_page(page_num, next_page_html, driver)
	all_page_num_list = all_page_num_list + this_page_num_list
	all_page_author_list = all_page_author_list + this_page_author_list
	all_page_title_list = all_page_title_list + this_page_title_list
	all_page_url_list = all_page_url_list + this_page_url_list
	next_page_url = driver.find_element_by_class_name("js-next-page-link").get_attribute("href")
	print("=======")
	print(next_page_url)
	print(len(next_page_url))
	print("=======")
else:
	print("\n\n Le traitement de la dernière page du résultat de la recherche d'article est terminé.\n\n")

#Sortie de fichier Excel
print("\n\n Exportez les données de résultats de recherche acquises dans un fichier Excel.\n\m")
data = np.array([all_page_num_list, all_page_author_list, all_page_title_list, all_page_url_list]).T

index_list = list(range(len(all_page_num_list)))
column_list = ['Publication du numéro de page dans l'écran des résultats de recherche', 'Donateur', 'Le titre de l'article', 'URL de l'article']
output_df = pd.DataFrame(data, columns=column_list, index=index_list)
pprint(output_df)

#Exportez le résultat dans un fichier Excel
output_df.to_excel('./'+output_file_name + '.xlsx', sheet_name='Qiita_Articles_list')

#Fermez et effacez (mémoire libre) l'instance de pilote créée pour l'accès automatique à la page Web
time.sleep(5)
driver.close()
driver.quit()

(Comment utiliser)

Console


$ python  selenium_python_multi_pages_while.py --help
usage: selenium_python_multi_pages_while.py [-h] [-word SEARCH_WORD]
                                            [-max MAX_PAGE_NUM]

optional arguments:
  -h, --help            show this help message and exit
  -word SEARCH_WORD, --search_word SEARCH_WORD
Veuillez spécifier le mot de recherche à saisir sur la page de recherche d'articles de Qiita.
  -max MAX_PAGE_NUM, --max_page_num MAX_PAGE_NUM
S'il existe plusieurs pages applicables et que vous souhaitez définir une limite supérieure pour le nombre de pages pour lesquelles des données peuvent être acquises, spécifiez la limite supérieure.
$ 

(Exemple d'exécution et son résultat)

Console


$ python  selenium_python_multi_pages_while.py -word Haskell -max 5


Chaîne de recherche entrée: Haskell

Si la page de la liste d'articles s'étend à plusieurs pages, le processus se terminera après 5 pages.

	================================
Traitement de la première page...
	===============================

['MD5 avec Haskell#Haskell',
 'stylish-Rendre haskell compatible avec HexFloatLiterals et Numeric Underscores',
 'Tutoriel Haskell(Haskell Day 2016)',
 'Créez l'environnement de développement le plus rapide en utilisant l'extension Haskell de VS Code',
 'stylish-Faire correspondre haskell à BlockArguments',
 'Utilisation de Functor avec Haskell',
 'Docker sur Windows10 Home+Création d'un environnement haskell avec VS Code',
 'Docker +Version Hello World de Haskell',
 'Jouez avec la classe de type Haskell',
 'À propos de Haskell's Either']
=======
<class 'str'>
=======

	================================
Traitement de la deuxième page...
	===============================

['Types de fonction Haskell et curry#Haskell',
 'Haskell et SQLite',
 'Premiers pas avec Haskell',
 'Haskell/Une collection de références pour rechercher la signification des symboles GHC',
 'Approaching Haskell',
 'Mémorandum sur l'article Haskell Primer',
 'Lire Taper Haskell dans Haskell',
 '[Haskell] Some memo about learning haskell',
 'Premiers pas avec Haskell-Installation et configuration de la pile',
 'J'ai créé une gemme appelée Haskell qui intègre le code de Haskell dans Ruby!']
=======
https://qiita.com/search?page=3&q=Haskell
41
=======

	================================
Traitement de la troisième page...
	===============================

['Lire Taper Haskell dans Haskell',
 'Préparer l'environnement de développement Haskell avec Visual Studio Code',
 'Pourquoi apprendre Haskell',
 '[Haskell] Some memo about learning haskell',
 'Notes d'installation Haskell',
 "Impossible avec VS Code't démarrer le client Haskell IDE sort (Windows 10)",
 'Pile Hasskell-Utilisons-le en mode',
 'Étudier Haskell Partie 1-Construction de l'environnement Haskell',
 'Haskeller a essayé de se lancer avec Rust',
 'Conseils pour démarrer avec Haskell pour devenir intermédiaire']
=======
https://qiita.com/search?page=4&q=Haskell
41
=======

	================================
Traitement page 4...
	===============================

['Haskell dans Atom Editor',
 'Créez une calculatrice de notation polonaise inversée avec Haskell',
 'Ide dans l'éditeur Atom-Étapes à suivre pour utiliser haskell',
 'Touchez Haskell sur Mac Note 0.1',
 'J'ai commencé Haskell',
 'Idée ATOM-procédure d'installation de haskell (MacOS X)',
 '[Français] Différence entre PureScript et Haskell\u3000+α',
 'Mémo Haskell',
 'Construction de l'environnement de développement Haskell sous Windows 10',
 'Vous pouvez manger chez Haskell!!']
=======
https://qiita.com/search?page=5&q=Haskell
41
=======

	================================
Traitement page 5...
	===============================

['Haskell Weekly News version japonaise(Procès) (5/8)',
 'Message complet pour les experts Haskell du monde entier',
 'Implémentation de la sortie Haskell quicktype pour générer du code pour chaque langage à partir de JSON',
 'haskell-ide-introduction du moteur',
 'Le point qui s'inscrit dans la construction de l'environnement de Haskell of VS Code sur macOS',
 'Implémenter l'outil Go avec Haskell',
 'Haskell($)Quand(.)La différence de',
 'Réponse de Samuel Gélineau Partie 1(Traduction)',
 'Mémo de construction de l'environnement Haskell',
 'Défi hebdomadaire d'introduction à la rouille de Haskeller, jour 1#Rust']
=======
https://qiita.com/search?page=6&q=Haskell
41
=======


Le traitement de la dernière page des résultats de la recherche d'articles est terminé.




Les données de résultats de recherche acquises sont sorties dans un fichier Excel.
\m
Publication du numéro de page dans l'écran des résultats de recherche Publié par\
0                1          Tatsuki-I
1                1          mod_poppo
2                1           hiratara
3                1             sgmryk
4                1      sparklingbaby
5                1         oskats1987
6                1     atsuyoshi-muta
7                1             dd0125
8                1         oskats1987
9                1             Izawa_
10               2          Tatsuki-I
11               2        satosystems
12               2            a163236
13               2        takenobu-hs
14               2         pumbaacave
15               2               F_cy
16               2              nka0i
17               2          zhupeijun
18               2      sparklingbaby
19               2         gogotanaka
20               3              nka0i
21               3          legokichi
22               3              arowM
23               3          zhupeijun
24               3             tnoda_
25               3            yutasth
26               3        t-mochizuki
27               3       CPyRbJvCHlCs
28               3            kanimum
29               3           Lugendre
30               4              eielh
31               4       inatatsu_csg
32               4       busyoumono99
33               4       hiroyuki_hon
34               4              Cj-bc
35               4  nakamurau1@github
36               4         hiruberuto
37               4             sahara
38               4       kitsukitsuki
39               4         reotasosan
40               5          imokurity
41               5         reotasosan
42               5              algas
43               5         dyoshikawa
44               5                dsm
45               5        kwhrstr1206
46               5         TTsurutani
47               5         reotasosan
48               5              1ain2
49               5          Tatsuki-I

Le titre de l'article\
0 Haskell MD5#Haskell
1   stylish-haskell à Hex Float Literals et Numeric Unders...
2 Tutoriel Haskell(Haskell Day 2016)
3 Créez l'environnement de développement le plus rapide à l'aide de l'extension Haskell de VS Code
4                stylish-Faire correspondre haskell à BlockArguments
5 Utilisation de Functor avec Haskell
6 Docker sur Windows10 Home+Création d'un environnement haskell avec VS Code
7                   Docker +Version Hello World de Haskell
8 Jouez avec la classe de moule Haskell
9 À propos de l'un ou l'autre de Haskell
10 types de fonctions Haskell et curry#Haskell
11 Haskell et SQLite
12 Premiers pas avec Haskell
13                   Haskell/Une collection de références pour rechercher la signification des symboles GHC
14                                Approaching Haskell
15 Mémorandum sur l'article introductif
16 Lire la frappe Haskell dans Haskell
17         [Haskell] Some memo about learning haskell
18 Premiers pas avec Haskell-Installation et configuration de la pile
19 J'ai créé une gemme appelée Haskell qui intègre le code de Haskell dans Ruby!
20 Lire la frappe Haskell dans Haskell
21 Préparer l'environnement de développement Haskell avec Visual Studio Code
22 Pourquoi apprendre Haskell
23         [Haskell] Some memo about learning haskell
24 Notes d'installation Haskell
25 VS Code Impossible'Le client de démarrage Haskell IDE sort (Wi...
26 pile haskell-Utilisons-le en mode
27 Étude Haskell, partie 1-Construction de l'environnement Haskell
28 Haskeller a commencé avec Rust
29 Directives pour démarrer avec Haskell pour devenir un intermédiaire
30 Haskell dans Atom Editor
31 Créez une calculatrice de notation polonaise inversée avec Haskell
32 ide dans l'éditeur Atom-Étapes à suivre pour utiliser haskell
33 Touchez Haskell sur Mac Note 0.1
34 J'ai commencé Haskell
35 idée ATOM-procédure d'installation de haskell (MacOS X)
36 [Français] Différence entre PureScript et Haskell + α
37 Note de Haskell
38 Création de l'environnement de développement Haskell sur Windows 10
39 Vous pouvez manger chez Haskell!!
40 Haskell Weekly News édition japonaise(Procès) (5/8)
41 Message complet aux experts Haskell du monde entier
42 Implémentation de la sortie Haskell quicktype pour générer du code pour chaque langage à partir de JSON
43                               haskell-ide-introduction du moteur
44 Le point qui s'inscrit dans la construction de l'environnement de Haskell of VS Code sur macOS
Mettre en œuvre l'outil 45 Go avec Haskell
46 Haskell($)Quand(.)La différence de
47 Réponse de Samuel Gélineau Partie 1(Traduction)
48 Mémo de construction de l'environnement Haskell
49 Défi hebdomadaire d'introduction à la rouille de Haskeller, jour 1#Rust

URL de l'article
0   http://qiita.com/Tatsuki-I/items/6d4a2d9f767ae...
1   http://qiita.com/mod_poppo/items/418da906f6621...
2   http://qiita.com/hiratara/items/169b5cb83b0adb...
3   http://qiita.com/sgmryk/items/bc99efe36ad1c910...
4   http://qiita.com/sparklingbaby/items/a46f299dd...
5   http://qiita.com/oskats1987/items/30f9078c5096...
6   http://qiita.com/atsuyoshi-muta/items/9dd10d48...
7   http://qiita.com/dd0125/items/a141000ead36b382...
8   http://qiita.com/oskats1987/items/dcd46780ff5e...
9   http://qiita.com/Izawa_/items/ed0579a0e7d93e5c...
10  http://qiita.com/Tatsuki-I/items/d1d122107da8c...
11  http://qiita.com/satosystems/items/32bf104a041...
12  http://qiita.com/a163236/items/5e0d0e373e87ca8...
13  http://qiita.com/takenobu-hs/items/b95f0a4409c...
14  http://qiita.com/pumbaacave/items/17e6699d4db8...
15   http://qiita.com/F_cy/items/9c49e351196943e38ad9
16  http://qiita.com/nka0i/items/d44f0c6d4df1ef582fd3
17  http://qiita.com/zhupeijun/items/4abcc5fa1cdce...
18  http://qiita.com/sparklingbaby/items/a901cb3a7...
19  http://qiita.com/gogotanaka/items/78a3ffd04abc...
20  http://qiita.com/nka0i/items/d44f0c6d4df1ef582fd3
21  http://qiita.com/legokichi/items/8e7a68ffee522...
22  http://qiita.com/arowM/items/0305d4f439752f285438
23  http://qiita.com/zhupeijun/items/4abcc5fa1cdce...
24  http://qiita.com/tnoda_/items/22b265fe9ad8ee1e...
25  http://qiita.com/yutasth/items/28af2eb0371f645...
26  http://qiita.com/t-mochizuki/items/d831df3a920...
27  http://qiita.com/CPyRbJvCHlCs/items/9da9b43b55...
28  http://qiita.com/kanimum/items/d89547235070038...
29  http://qiita.com/Lugendre/items/70e517e59698e0...
30  http://qiita.com/eielh/items/b2e85f8ea4c6cdb8012d
31  http://qiita.com/inatatsu_csg/items/b035c76ec6...
32  http://qiita.com/busyoumono99/items/220bd3c30f...
33  http://qiita.com/hiroyuki_hon/items/3eb41a16fe...
34  http://qiita.com/Cj-bc/items/583fa82805775cf17dd6
35  http://qiita.com/nakamurau1@github/items/7feae...
36  http://qiita.com/hiruberuto/items/3eb21ef81b3d...
37  http://qiita.com/sahara/items/7c7ef646fb3e9b08...
38  http://qiita.com/kitsukitsuki/items/a56cbfc0de...
39  http://qiita.com/reotasosan/items/e80ab706baef...
40  http://qiita.com/imokurity/items/f90e4c35c74fe...
41  http://qiita.com/reotasosan/items/2b37fdef025a...
42  http://qiita.com/algas/items/1ebb9b8c77fc5f344708
43  http://qiita.com/dyoshikawa/items/a1789bf7ff1d...
44    http://qiita.com/dsm/items/861d08844b1fba32f07b
45  http://qiita.com/kwhrstr1206/items/fdf460f2a9a...
46  http://qiita.com/TTsurutani/items/201200c1f288...
47  http://qiita.com/reotasosan/items/cce796d32105...
48  http://qiita.com/1ain2/items/09ad8b0e4992f7ceae0f
49  http://qiita.com/Tatsuki-I/items/e19953c051e55...
$ 

(Fichiers de sortie)

スクリーンショット 2020-11-08 0.27.17.png

(Fichier Excel)

スクリーンショット 2020-11-08 0.29.50.png

(Fichier Png)

スクリーンショット 2020-11-08 0.30.42.png

(Les fichiers d'image de capture d'écran sur la page du milieu sont omis)

スクリーンショット 2020-11-08 0.31.21.png

Autres: la chaîne de caractères de recherche pour les articles peut être Kanji Katakana ou Kana.

Console}


$ python  selenium_python_multi_pages_while.py -théorie de la sphère des mots-max 20

Recommended Posts

[Selenium] Utilisez l'instruction while pour passer à plusieurs reprises à la "page suivante"
[Selenium] Aller à la page suivante sans appuyer sur Suivant
[Introduction à Python] Comment utiliser l'opérateur in dans l'instruction for?
[Wagtail] Ajouter une page de connexion au projet Wagtail
Pratique pour utiliser les sous-graphiques matplotlib dans l'instruction for
Comment utiliser la méthode __call__ dans la classe Python
[Part.2] Exploration avec Python! Cliquez sur la page Web pour vous déplacer!
Je ne savais pas comment utiliser l'instruction [python] for
Comment utiliser le générateur
Comment utiliser le décorateur
[Python] Comment utiliser l'instruction for. Une méthode d'extraction en spécifiant une plage ou des conditions.
Comment déterminer l'existence d'un élément sélénium en Python
J'ai comparé Jinja2 en lisant le document pour l'utiliser avec Django
Je veux utiliser quatre règles compliquées dans l'instruction IF du modèle Django! → Utilisez un modèle personnalisé
Utilisez Rust pour déplacer Pocket Miku.
Comment utiliser la fonction zip
Comment utiliser le module optparse
Remarques sur l'exécution d'Errbot localement
Comment utiliser le module ConfigParser
J'ai essayé de déplacer le ballon
Un mémo pour utiliser simplement le capteur d'éclairement TSL2561 avec Raspberry Pi 2
[Introduction à Udemy Python3 + Application] 47. Traitez le dictionnaire avec une instruction for
[Python] Explique comment utiliser la fonction range avec un exemple concret
Utilisez un raccourci pour activer ou désactiver le pavé tactile dans Linux Mint
Comment lire une vidéo tout en regardant le nombre d'images (Mac)
Je pensais qu'il serait lent d'utiliser l'instruction for dans NumPy, mais ce n'était pas le cas.