Lorsque je recherche quelque chose que je ne comprends pas sur Google, je ne recherche pas seulement sur un site pour améliorer la fiabilité de la source, mais je recherche également sur plusieurs sites. À ce moment-là, j'ai trouvé gênant d'ouvrir les pages de résultats de recherche une par une, j'ai donc créé un programme qui ouvre 10 pages de recherche à la fois lorsque je recherche un mot. En plus de cela, j'ai pensé qu'il serait pratique de pouvoir enregistrer l'historique de recherche, alors j'ai fait en sorte que le titre et l'URL de la page de résultats de recherche soient automatiquement résumés dans EXCEL.
CPU:Intel core i5 7200U dual core OS:Winddows10 home Python 3.8.2(Anaconda) Chrome Driver 81.0.4044.92 Selenium Openpyxl
Écrivez en supposant que l'environnement d'exécution est en place.
Entrez le mot de recherche et le raffinement dans la zone de texte de l'interface graphique Appuyez sur le bouton de recherche Les 10 meilleurs sites dans les résultats de recherche s'ouvrent dans un onglet séparé à la fois L'URL et le titre du site recherché sont écrits dans Excel
Tout d'abord, créez une zone de texte avec PySimpleGUI et affichez les caractères saisis. Je l'ai fait en référence à ce site.
import PySimpleGUI as sg
sg.theme('Dark Blue 3')
layout = [[sg.Text('Rechercher un mot', size=(15, 1)), sg.InputText(default_text='', key='-SEARCHWORD-')],
[sg.Text('Réduire les conditions', size=(15, 1)), sg.InputText(
default_text='', key='-CONDITION-')],
[sg.Submit('Chercher')]]
window = sg.Window('Entrez un mot de recherche', layout)
while True:
event, values = window.read()
if event is None:
print('exit')
break
if event == 'Chercher':
show_message = "Mot de recherche:" + values['-SEARCHWORD-'] + 'A été entré.\n'
show_message = "Conditions de rétrécissement:" + values['-CONDITION-'] + 'A été entré.\n'
sg.popup(show_message)
window.close()
Nous ferons du web scraping avec du sélénium. Pour savoir comment l'utiliser, je me suis référé à la référence rapide. Affichez le «Titre», «URL» et «Résumé» pour plus de commodité lors de leur mise en place dans Excel ultérieurement, puis ouvrez-les dans un nouvel onglet.
open_newtab.py
from selenium import webdriver
import chromedriver_binary
from selenium.webdriver.common.by import By
search_word = 'utilisation de python'
const = 'https://www.google.com/search?q='
getword = const+search_word
driver = webdriver.Chrome()
driver.get(getword)
url_list = []
for i, g in enumerate(driver.find_elements(By.CLASS_NAME, "g")):
print("------ " + str(i+1) + " ------")
r = g.find_element(By.CLASS_NAME, "r")
print(r.find_element(By.TAG_NAME, "h3").text)
url = r.find_element(By.TAG_NAME, "a").get_attribute("href") #Extraire l'URL
url_list.append(url)
print("\t" + url)
s = g.find_element(By.CLASS_NAME, "s")
print("\t" + s.find_element(By.CLASS_NAME, "st").text)
for num in range(10):
driver.execute_script("window.open()") #Ouvrez un nouvel onglet
driver.switch_to.window(driver.window_handles[num+1]) #Passer au nouvel onglet
driver.get(url_list[num])
Cependant, si vous le laissez tel quel, il faudra beaucoup de temps pour ouvrir l'onglet suivant après avoir attendu que la page s'affiche. Dans ce cas, il est préférable de le saisir manuellement. Je veux pouvoir passer à la page suivante avant que la page ne s'affiche. Utilisez donc "CONTROL" + clic pour changer la page à ouvrir dans un nouvel onglet.
Puisque xpath est pratique pour cliquer sur des boutons et des liens à un endroit fixe, je vais l'utiliser activement.
Ajoutez du code comme indiqué dans la référence rapide (https://www.seleniumqref.com/api/python/actions/Python_key_down_click.html).
Si vous vérifiez le xpath du titre du résultat de la recherche Web, `// * [@id =" rso "] / div [1] / div / div [1] / a / h3 '',`
// * [@id = "rso"] / div [2] / div / div [1] / a / h3 "` ...
Vous pouvez voir que l'argument du premier '' / div [1]
à partir de la gauche est différent. Donnez-lui une variable et tournez-la avec une instruction for.
open_newtab.py
from selenium import webdriver
import chromedriver_binary
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
search_word = 'utilisation de python'
const = 'https://www.google.com/search?q='
getword = const+search_word
driver = webdriver.Chrome()
driver.get(getword)
url_list = []
for i, g in enumerate(driver.find_elements(By.CLASS_NAME, "g")):
print("------ " + str(i+1) + " ------")
r = g.find_element(By.CLASS_NAME, "r")
print(r.find_element(By.TAG_NAME, "h3").text)
url = r.find_element(By.TAG_NAME, "a").get_attribute("href") #Extraire l'URL
url_list.append(url)
print("\t" + url)
s = g.find_element(By.CLASS_NAME, "s")
print("\t" + s.find_element(By.CLASS_NAME, "st").text)
xpath = '//*[@id = "rso"]/div[{}]/div/div[1]/a/h3' #Titre cliquez sur xpath
for num in range(10):
element = driver.find_element_by_xpath(xpath.format(num+1))
actions = ActionChains(driver)
actions.key_down(Keys.CONTROL)
actions.click(element)
actions.perform()
Lorsque vous enregistrez le fichier Excel, il sera enregistré dans le répertoire actuel.
wite_to_excel.py
import openpyxl
from selenium import webdriver
import chromedriver_binary
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import datetime
search_word = 'python openpyxl'
const = 'https://www.google.com/search?q='
getword = const+search_word
driver = webdriver.Chrome()
driver.get(getword)
url_list = []
title_list = []
Overview_list = []
for i, g in enumerate(driver.find_elements(By.CLASS_NAME, "g")):
r = g.find_element(By.CLASS_NAME, "r")
title_list.append(r.find_element(By.TAG_NAME, "h3").text) #Extraire le titre
url_list.append(r.find_element(
By.TAG_NAME, "a").get_attribute("href")) #Extraire l'URL
s = g.find_element(By.CLASS_NAME, "s")
Overview_list.append(s.find_element(By.CLASS_NAME, "st").text) #Extraction de contour
xpath = '//*[@id = "rso"]/div[{}]/div/div[1]/a/h3' #Titre cliquez sur xpath
for num in range(10):
element = driver.find_element_by_xpath(xpath.format(num+1))
actions = ActionChains(driver)
actions.key_down(Keys.CONTROL)
actions.click(element)
actions.perform()
wb = openpyxl.Workbook() #Créer un nouvel objet Workbook vide
ws = wb.active
ws.title = 'sheet1'
#ws = sheet.get_sheet_by_name('Sheet1')
ws['A1'] = 'Date'
ws['B1'] = 'Titre'
ws['C1'] = 'Aperçu'
ws['D1'] = 'URL'
def write_in_xlsx(column_num, list):
num = 0
for row in range(2, 11):
ws.cell(row=row, column=column_num).value = list[num]
num = num+1
for row in range(2, 11):
ws.cell(row=row, column=1).value = datetime.datetime.today()
write_in_xlsx(2, title_list)
write_in_xlsx(3, Overview_list)
write_in_xlsx(4, url_list)
wb.save('test.xlsx') # test.Enregistrer sous xlsx
Cela pose encore des problèmes. Lorsqu'une recherche Google est effectuée et que le résultat de la recherche apparaît sur le côté droit, comme indiqué sur cette photo,
selenium.common.exceptions.NoSuchElementException: Message: aucun élément de ce type: Impossible de localiser l'élément: {"méthode" : "css selector", "selector": ".r"} ```et une exception se produit.
Voici le code qui implémente toutes les fonctions.
class Websc, `` class Excel
, `class GUIWindow
`` `Je veux créer un dessin de conception qui est la base de chaque fonction et combiner des objets avec la classe Application pour réaliser cette fois Créer une fonction. Exécutez le fichier et tapez dans la zone de texte pour ouvrir les onglets à la fois. (Les conditions de raffinement ne sont pas mises en œuvre)
Au fait, pourquoi ne puis-je pas rechercher sans appuyer deux fois sur le bouton? Si quelqu'un connaît la cause, veuillez commenter.
web_search_Efficiency.py
import PySimpleGUI as sg
import time
import openpyxl
from selenium import webdriver
import chromedriver_binary
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import datetime
def main():
app = Application()
app.RUN()
class WebSc:
def __init__(self,):
self.search_word = ''
self.const = 'https://www.google.com/search?q='
self.url_list = []
self.title_list = []
self.Overview_list = []
self.search_word = 0
self.driver = 0
def SetSearchWord(self, search_word):
getword = self.const + search_word
self.driver = webdriver.Chrome()
self.driver.get(getword)
def ExtractElement(self):
for g in self.driver.find_elements(By.CLASS_NAME, "g"):
try:
r = g.find_element(By.CLASS_NAME, "r")
self.title_list.append(r.find_element(
By.TAG_NAME, "h3").text) #Extraire le titre
self.url_list.append(r.find_element(
By.TAG_NAME, "a").get_attribute("href")) #Extraire l'URL
s = g.find_element(By.CLASS_NAME, "s")
self.Overview_list.append(s.find_element(
By.CLASS_NAME, "st").text) #Extraction de contour
except:
continue
def ClickElementAsNewTab(self, click_num): # num:Combien de hauts pour obtenir
xpath = '//*[@id = "rso"]/div[{}]/div/div[1]/a/h3' #Titre cliquez sur xpath
for num in range(click_num):
element = self.driver.find_element_by_xpath(xpath.format(num+1))
actions = ActionChains(self.driver)
actions.key_down(Keys.CONTROL)
actions.click(element)
actions.perform()
class Excel:
def __init__(self, websc):
self.wb = openpyxl.Workbook() #Créer un nouvel objet Workbook vide
self.ws = self.wb.active
self.ws.title = 'sheet1'
self.cell_list = ['A1', 'B1', 'C1', 'D1']
self.name_list = ['Date', 'Titre', 'Aperçu', 'URL']
self.url_list = []
self.title_list = []
self.Overview_list = []
def SetGotList(self, title_list, Overview_list, url_list): #Sélecteur de liste obtenu de l'extérieur
self.url_list = url_list
self.title_list = title_list
self.Overview_list = Overview_list
def __write_in_column(self, column_num, list, min=2, max=12): #Fonction pour écrire les cellules une colonne à la fois
num = 0
for row in range(min, max):
self.ws.cell(row=row, column=column_num).value = list[num]
num = num + 1
def SetCellname(self, cell_list, name_list): #Fonction pour nommer la cellule
for num, cell in enumerate(cell_list):
self.ws[cell] = name_list[num]
def MakeFile(self, file_name):
self.SetCellname(self.cell_list, self.name_list) #Donnez un nom à la ligne du haut
for row in range(2, 12):
self.ws.cell(
row=row, column=1).value = datetime.datetime.today() #La première colonne est la date
self.__write_in_column(2, self.title_list) #Ecrire le titre acquis
self.__write_in_column(3, self.Overview_list)
self.__write_in_column(4, self.url_list)
self.wb.save(file_name) # test.Enregistrer sous xlsx
class GUIWindow:
def __init__(self,):
sg.theme('Dark Blue 3')
self.layout = [[sg.Text('Rechercher un mot', size=(15, 1)), sg.InputText(default_text='', key='-SEARCHWORD-')],
[sg.Text('Réduire les conditions', size=(15, 1)), sg.InputText(
default_text='', key='-CONDITION-')], [sg.Text('Nom du fichier Excel', size=(15, 1)), sg.InputText(default_text='', key='-EXCELFILE-')],
[sg.Submit('Chercher'), sg.Submit('Chercher and ファイル保存')]]
self.window = sg.Window('Entrez un mot de recherche', self.layout)
self.event = 0
self.values = 0
def CloseWindow(self):
self.window.close()
def ReadWindow(self):
self.event, self.values = self.window.read()
class Application: #Cette application
window = GUIWindow()
websc = WebSc()
excel = Excel(websc)
def __init__(self):
pass
def ButtonAction(self, button_name): #Comportement lorsque le bouton d'argument est enfoncé
if button_name == 'Chercher':
Application.window.ReadWindow()
Application.websc.SetSearchWord(
Application.window.values['-SEARCHWORD-'])
Application.websc.ExtractElement() #Extraction d'éléments
Application.websc.ClickElementAsNewTab(10) #Précisez le nombre de sites d'acquisition
if button_name == 'Rechercher et enregistrer le fichier':
Application.window.ReadWindow()
Application.websc.SetSearchWord(
Application.window.values['-SEARCHWORD-'])
Application.websc.ExtractElement()
Application.websc.ClickElementAsNewTab(10) #Précisez le nombre de sites d'acquisition
Application.excel.SetGotList(Application.websc.title_list, Application.websc.Overview_list,
Application.websc.url_list) #Définissez ce que vous avez
Application.excel.MakeFile(
Application.window.values['-EXCELFILE-']) #Créer un fichier Excel
def RUN(self):
while True:
Application.window.ReadWindow()
if Application.window.event is None:
print('exit')
break
if Application.window.event == 'Chercher':
self.ButtonAction('Chercher')
if Application.window.event == 'Rechercher et enregistrer le fichier':
self.ButtonAction('Rechercher et enregistrer le fichier')
Application.excel.CloseWindow()
if __name__ == "__main__":
main()
Cette fois, c'était un programme qui ouvre automatiquement plusieurs onglets, mais il semble que diverses fonctions puissent être réalisées en ajoutant des fonctions à chaque classe ou en modifiant la combinaison de méthodes dans Application. Par exemple, un bot qui recherche des mots enregistrés et recherche automatiquement à un moment spécifié pour collecter des informations est susceptible de se développer.
https://qiita.com/memakura/items/20a02161fa7e18d8a693#%E5%BE%85%E3%81%A4
Recommended Posts