Rationalisez la recherche Web avec Python

Aperçu

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.

environnement

CPU:Intel core i5 7200U dual core OS:Winddows10 home Python 3.8.2(Anaconda) Chrome Driver 81.0.4044.92 Selenium Openpyxl

Sujet principal

Écrivez en supposant que l'environnement d'exécution est en place.

Flux de l'ensemble du programme

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

Créer une zone de texte

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.

``textbox.py`


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()

De la recherche de mots à l'ouverture d'un onglet

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()

Écrivez ce que vous avez recherché sur le Web dans Excel

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. error.PNG

Programme terminé

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. honban.PNG

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.

Autres références

https://qiita.com/memakura/items/20a02161fa7e18d8a693#%E5%BE%85%E3%81%A4

Recommended Posts

Rationalisez la recherche Web avec Python
Recherche séquentielle avec Python
Dichotomie avec python
Dichotomie avec Python 3
Web scraping avec python + JupyterLab
API Web avec Python + Falcon
Recherche de bits complète avec Python
Les moteurs de recherche fonctionnent avec python
Rechercher des tweets Twitter avec Python
Application Web avec Python + Flask ② ③
Web scraping débutant avec python
Application Web avec Python + Flask ④
Premiers pas avec les applications Web Python
Surveillez les applications Web Python avec Prometheus
[python] Dessin simplifié
FizzBuzz en Python3
Grattage avec Python
Grattage WEB avec Python (pour mémo personnel)
Statistiques avec python
Grattage avec Python
Python avec Go
Premiers pas avec Python Web Scraping Practice
Intégrer avec Python
Rechercher le labyrinthe avec l'algorithme python A *
AES256 avec python
Démonisez une application Web Python avec Supervisor
Testé avec Python
[Note personnelle] Scraping de pages Web en python3
python commence par ()
Télécharger des fichiers sur le Web avec Python
Site de courses de chevaux Web scraping avec Python
[Python] Une application web rapide avec Bottle!
avec syntaxe (Python)
Premiers pas avec Python Web Scraping Practice
Application Web facile avec Python + Flask + Heroku
Bingo avec python
Zundokokiyoshi avec python
Exécutez une application Web Python avec Docker
Pratiquer le web scraping avec Python et Selenium
Créez un framework Web avec Python! (2)
Excel avec Python
[Pour les débutants] Essayez le web scraping avec Python
Micro-ordinateur avec Python
Cast avec python
Sortie CSV de la recherche Google avec [Python]! 【Facile】
Rechercher et télécharger automatiquement des vidéos YouTube avec Python
Raisonnement causal et recherche causale par Python (pour les débutants)
Contenu Web Python réalisé avec le serveur bon marché Lolipop
Gagnez l'application Web Python + Flask avec Jenkins
Introduction à Tornado (1): Framework Web Python démarré avec Tornado
La requête [Développement Web avec Python] est également redirigée
Démarrez un serveur Web Python simple avec Docker
[python] Récupérez rapidement les métadonnées de la page Web avec lassie
Lancer un serveur Web avec Python et Flask
Vitesse explosive avec Python (bouteille)! Développement d'API Web
Web scraping avec Python (prévisions météo)