Optimieren Sie die Websuche mit Python

Überblick

Wenn ich bei Google nach etwas suche, das ich nicht verstehe, suche ich nicht nur von einer Website aus, um die Zuverlässigkeit der Quelle zu verbessern, sondern suche auch über mehrere Websites hinweg. Zu dieser Zeit war es schwierig, die Suchergebnisseiten einzeln zu öffnen. Deshalb habe ich ein Programm erstellt, das 10 Suchseiten gleichzeitig öffnet, wenn ich ein Wort nachschlage. Darüber hinaus hielt ich es für zweckmäßig, den Suchverlauf aufzeichnen zu können, und habe ihn so gestaltet, dass Titel und URL der Suchergebnisseite automatisch in EXCEL zusammengefasst werden.

Umgebung

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

Hauptthema

Schreiben Sie unter der Annahme, dass die Ausführungsumgebung vorhanden ist.

Ablauf des gesamten Programms

Geben Sie das Suchwort und die Verfeinerung in das Textfeld der GUI ein Drücken Sie die Suchtaste Die Top 10 Websites in den Suchergebnissen werden sofort in einem separaten Tab geöffnet Die URL und der Titel der gesuchten Site werden in Excel geschrieben

Erstellen Sie ein Textfeld

Erstellen Sie zunächst ein Textfeld mit PySimpleGUI und zeigen Sie die eingegebenen Zeichen an. Ich habe es mit Bezug auf [diese Site] gemacht (https://qiita.com/dario_okazaki/items/656de21cab5c81cabe59#pysimplegui).

``textbox.py`


import PySimpleGUI as sg
sg.theme('Dark Blue 3')
layout = [[sg.Text('Suchbegriff', size=(15, 1)), sg.InputText(default_text='', key='-SEARCHWORD-')],
          [sg.Text('Eingrenzung der Bedingungen', size=(15, 1)), sg.InputText(
              default_text='', key='-CONDITION-')],
          [sg.Submit('Suche')]]
window = sg.Window('Geben Sie ein Suchwort ein', layout)
while True:
    event, values = window.read()

    if event is None:
        print('exit')
        break

    if event == 'Suche':
        show_message = "Suchbegriff:" + values['-SEARCHWORD-'] + 'Wurde eingegeben.\n'
        show_message = "Enge Bedingungen:" + values['-CONDITION-'] + 'Wurde eingegeben.\n'
        sg.popup(show_message)

window.close()

Von der Wortsuche bis zum Öffnen eines Tabs

Wir werden Web Scraping mit Selen durchführen. Für die Verwendung habe ich auf die Kurzreferenz verwiesen. Zeigen Sie "Titel", "URL" und "Zusammenfassung" an, um sie später in Excel zusammenzustellen, und öffnen Sie sie dann in einer neuen Registerkarte.

open_newtab.py


from selenium import webdriver
import chromedriver_binary
from selenium.webdriver.common.by import By
search_word = 'Python-Nutzung'
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")  #URL extrahieren
    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()")  #Öffnen Sie eine neue Registerkarte
    driver.switch_to.window(driver.window_handles[num+1])  #Wechseln Sie zur neuen Registerkarte
    driver.get(url_list[num])

Wenn Sie es jedoch unverändert lassen, dauert es sehr lange, bis die nächste Registerkarte geöffnet ist, nachdem Sie darauf gewartet haben, dass die Seite angezeigt wird. In diesem Fall ist es besser, es manuell einzugeben. Ich möchte in der Lage sein, zur nächsten Seite zu wechseln, bevor die Seite angezeigt wird. Verwenden Sie also "CONTROL" + Klicken, um die Seite so zu ändern, dass sie in einem neuen Tab geöffnet wird. Da xpath zum Klicken auf Schaltflächen und Links an einer festen Stelle geeignet ist, werde ich es aktiv verwenden. Fügen Sie den Code wie in der Kurzübersicht (https://www.seleniumqref.com/api/python/actions/Python_key_down_click.html) gezeigt hinzu. Wenn Sie den x-Pfad des Titels des Websuchergebnisses überprüfen, `// * [@id =" rso "] / div [1] / div / div [1] / a / h3```,` // * [@id = "rso"] / div [2] / div / div [1] / a / h3``` ... Sie können sehen, dass das Argument des ersten `/ div [1]` von links anders ist. Geben Sie diesem eine Variable und drehen Sie sie mit einer for-Anweisung.

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 = 'Python-Nutzung'
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")  #URL extrahieren
    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'  #Titelklick 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()

Schreiben Sie das, wonach Sie im Web gesucht haben, in Excel

Wenn Sie die Excel-Datei speichern, wird sie im aktuellen Verzeichnis gespeichert.

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)  #Extrahieren Sie den Titel
    url_list.append(r.find_element(
        By.TAG_NAME, "a").get_attribute("href"))  #URL extrahieren
    s = g.find_element(By.CLASS_NAME, "s")
    Overview_list.append(s.find_element(By.CLASS_NAME, "st").text)  #Extraktion der Kontur

    xpath = '//*[@id = "rso"]/div[{}]/div/div[1]/a/h3'  #Titelklick 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()  #Erstellen Sie ein neues leeres Arbeitsmappenobjekt
ws = wb.active
ws.title = 'sheet1'
#ws = sheet.get_sheet_by_name('Sheet1')


ws['A1'] = 'Datum'
ws['B1'] = 'Titel'
ws['C1'] = 'Überblick'
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.Als xlsx speichern

Das hat immer noch Probleme. Wenn eine Google-Suche durchgeführt wird und das Suchergebnis wie auf diesem Foto gezeigt auf der rechten Seite angezeigt wird, `selenium.common.exceptions.NoSuchElementException: Nachricht: kein solches Element: Element: {" Methode "kann nicht gefunden werden : "css selector", "selector": ".r"} `und eine Ausnahme tritt auf. error.PNG

Programm abgeschlossen

Unten finden Sie den Code, der alle Funktionen implementiert. `class Websc```,` `class Excel```,` `class GUIWindow `Ich möchte eine Konstruktionszeichnung erstellen, die die Grundlage jeder Funktion bildet, und Objekte mit der Application-Klasse kombinieren, um diese Zeit zu realisieren Eine Funktion erstellen. Führen Sie die Datei aus und geben Sie das Textfeld ein, um die Registerkarten sofort zu öffnen. (Verfeinerungsbedingungen sind nicht implementiert) Warum kann ich übrigens nicht suchen, ohne die Taste zweimal zu drücken? Wenn jemand die Ursache kennt, bitte kommentieren. 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)  #Extrahieren Sie den Titel
                self.url_list.append(r.find_element(
                    By.TAG_NAME, "a").get_attribute("href"))  #URL extrahieren
                s = g.find_element(By.CLASS_NAME, "s")
                self.Overview_list.append(s.find_element(
                    By.CLASS_NAME, "st").text)  #Extraktion der Kontur
            except:
                continue

    def ClickElementAsNewTab(self, click_num):  # num:Wie viele Tops zu bekommen
        xpath = '//*[@id = "rso"]/div[{}]/div/div[1]/a/h3'  #Titelklick 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()  #Erstellen Sie ein neues leeres Arbeitsmappenobjekt
        self.ws = self.wb.active
        self.ws.title = 'sheet1'
        self.cell_list = ['A1', 'B1', 'C1', 'D1']
        self.name_list = ['Datum', 'Titel', 'Überblick', 'URL']
        self.url_list = []
        self.title_list = []
        self.Overview_list = []

    def SetGotList(self, title_list, Overview_list, url_list):  #Listensetzer von außen erhalten
        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):  #Funktion zum spaltenweisen Schreiben von Zellen
        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):  #Funktion zum Benennen der Zelle
        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)  #Geben Sie der obersten Zeile einen Namen
        for row in range(2, 12):
            self.ws.cell(
                row=row, column=1).value = datetime.datetime.today()  #Die erste Spalte ist das Datum
        self.__write_in_column(2, self.title_list)  #Schreiben Sie den erworbenen Titel
        self.__write_in_column(3, self.Overview_list)
        self.__write_in_column(4, self.url_list)
        self.wb.save(file_name)  # test.Als xlsx speichern


class GUIWindow:
    def __init__(self,):
        sg.theme('Dark Blue 3')
        self.layout = [[sg.Text('Suchbegriff', size=(15, 1)), sg.InputText(default_text='', key='-SEARCHWORD-')],
                       [sg.Text('Eingrenzung der Bedingungen', size=(15, 1)), sg.InputText(
                           default_text='', key='-CONDITION-')], [sg.Text('Excel-Dateiname', size=(15, 1)), sg.InputText(default_text='', key='-EXCELFILE-')],
                       [sg.Submit('Suche'), sg.Submit('Suche and ファイル保存')]]
        self.window = sg.Window('Geben Sie ein Suchwort ein', 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:  #Diese Anwendung
    window = GUIWindow()
    websc = WebSc()
    excel = Excel(websc)

    def __init__(self):
        pass

    def ButtonAction(self, button_name):  #Verhalten beim Drücken der Argumenttaste
        if button_name == 'Suche':
            Application.window.ReadWindow()
            Application.websc.SetSearchWord(
                Application.window.values['-SEARCHWORD-'])
            Application.websc.ExtractElement()  #Elementextraktion
            Application.websc.ClickElementAsNewTab(10)  #Geben Sie die Anzahl der Erfassungsorte an

        if button_name == 'Datei suchen und speichern':
            Application.window.ReadWindow()
            Application.websc.SetSearchWord(
                Application.window.values['-SEARCHWORD-'])
            Application.websc.ExtractElement()
            Application.websc.ClickElementAsNewTab(10)  #Geben Sie die Anzahl der Erfassungsorte an
            Application.excel.SetGotList(Application.websc.title_list, Application.websc.Overview_list,
                                         Application.websc.url_list)  #Stellen Sie ein, was Sie haben
            Application.excel.MakeFile(
                Application.window.values['-EXCELFILE-'])  #Excel-Datei erstellen

    def RUN(self):
        while True:
            Application.window.ReadWindow()
            if Application.window.event is None:
                print('exit')
                break
            if Application.window.event == 'Suche':
                self.ButtonAction('Suche')
            if Application.window.event == 'Datei suchen und speichern':
                self.ButtonAction('Datei suchen und speichern')

        Application.excel.CloseWindow()


if __name__ == "__main__":
    main()

Diesmal war es ein Programm, das automatisch mehrere Registerkarten öffnet, aber es scheint, dass verschiedene Funktionen realisiert werden können, indem jeder Klasse Funktionen hinzugefügt oder die Methodenkombination in Application geändert wird. Beispielsweise wird ein Bot, der nach registrierten Wörtern sucht und zu einem bestimmten Zeitpunkt automatisch nach Informationen sucht, wahrscheinlich erweitert.

andere Referenzen

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

Recommended Posts

Optimieren Sie die Websuche mit Python
Sequentielle Suche mit Python
Dichotomie mit Python
Dichotomie mit Python 3
Web Scraping mit Python + JupyterLab
Web-API mit Python + Falcon
Vollbit-Suche mit Python
Suchmaschinen arbeiten mit Python
Suche nach Twitter-Tweets mit Python
Webanwendung mit Python + Flask ② ③
Web Scraping Anfänger mit Python
Webanwendung mit Python + Flask ④
Erste Schritte mit Python-Webanwendungen
Überwachen Sie Python-Webanwendungen mit Prometheus
[Python] Zeichnung optimieren
FizzBuzz in Python3
Scraping mit Python
WEB-Scraping mit Python (für persönliche Notizen)
Statistik mit Python
Scraping mit Python
Python mit Go
Erste Schritte mit Python Web Scraping Practice
In Python integrieren
Durchsuche das Labyrinth mit dem Python A * -Algorithmus
AES256 mit Python
Dämonisieren Sie eine Python-Webanwendung mit Supervisor
Getestet mit Python
[Persönlicher Hinweis] Scraping von Webseiten in Python3
Python beginnt mit ()
Laden Sie mit Python Dateien im Web herunter
Pferderennseite Web Scraping mit Python
[Python] Eine schnelle Webanwendung mit Bottle!
mit Syntax (Python)
Erste Schritte mit Python Web Scraping Practice
Einfache Web-App mit Python + Flask + Heroku
Bingo mit Python
Zundokokiyoshi mit Python
Führen Sie eine Python-Webanwendung mit Docker aus
Üben des Web-Scrapings mit Python und Selen
Erstellen Sie ein Webframework mit Python! (2)
Excel mit Python
[Für Anfänger] Versuchen Sie Web Scraping mit Python
Mikrocomputer mit Python
Mit Python besetzen
CSV-Ausgabe der Google-Suche mit [Python]! 【Einfach】
Suchen und laden Sie YouTube-Videos automatisch mit Python herunter
Kausales Denken und kausale Suche von Python (für Anfänger)
Python Web Content mit Lolipop billigen Server gemacht
Gewinnen Sie die Python + Flask-Web-App mit Jenkins
Einführung in Tornado (1): Python Web Framework mit Tornado gestartet
Die Abfrage [Webentwicklung mit Python] wird ebenfalls umgeleitet
Starten Sie mit Docker einen einfachen Python-Webserver
[Python] Mit Metie schnell Webseiten-Metadaten abrufen
Starten Sie einen Webserver mit Python und Flask
Explosive Geschwindigkeit mit Python (Flasche)! Web-API-Entwicklung
Web Scraping mit Python (Wettervorhersage)