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.
CPU:Intel core i5 7200U dual core OS:Winddows10 home Python 3.8.2(Anaconda) Chrome Driver 81.0.4044.92 Selenium Openpyxl
Schreiben Sie unter der Annahme, dass die Ausführungsumgebung vorhanden ist.
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 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).
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()
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()
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.
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.
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.
https://qiita.com/memakura/items/20a02161fa7e18d8a693#%E5%BE%85%E3%81%A4
Recommended Posts