Tips
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")
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")
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()
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.
$
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...
$
(Les fichiers d'image de capture d'écran sur la page du milieu sont omis)
Console}
$ python selenium_python_multi_pages_while.py -théorie de la sphère des mots-max 20
Recommended Posts