Как открыть и получить доступ к нескольким (почти 50) вкладкам в Chrome с помощью ChromeDriver и Selenium через Python - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь собрать некоторую информацию с определенных веб-страниц, используя селен и python. У меня есть рабочий код для одной вкладки. Но теперь у меня есть ситуация, когда мне нужно сразу открыть 50 вкладок в chrome и обработать данные каждой страницы.

1) Итак, открыть сразу 50 вкладок - код, который я уже получил 2) Измените элемент управления между вкладками и обработайте информацию со страницы, закройте вкладку, перейдите к следующей вкладке и сделайте то же самое.

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.common.exceptions import TimeoutException
import psycopg2
import os
import datetime

final_results=[]
positions=[]
saerched_url=[]

options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
#options.add_argument('--headless')
options.add_argument("—-incognito")
browser = webdriver.Chrome(executable_path='/users/user_123/downloads/chrome_driver/chromedriver', chrome_options=options)
browser.implicitly_wait(20)

#def db_connect():
try:
     DSN = "dbname='postgres' user='postgres' host='localhost' password='postgres' port='5432'"
     TABLE_NAME = 'staging.search_url'
     conn = psycopg2.connect(DSN)
     print("Database connected...")
     cur = conn.cursor()
     cur.execute("SET datestyle='German'")
except (Exception, psycopg2.Error) as error:
     print('database connection failed')
     quit()

def get_products(url):
    browser.get(url)
    names = browser.find_elements_by_xpath("//span[@class='pymv4e']")
    upd_product_name_list=list(filter(None, names))
    product_name = [x.text for x in upd_product_name_list]
    product = [x for x in product_name if len(x.strip()) > 2]
    upd_product_name_list.clear()
    product_name.clear()
    return product


links = ['https://www.google.com/search?q=Vitamin+D',
'https://www.google.com/search?q=Vitamin+D3',
'https://www.google.com/search?q=Vitamin+D+K2',
'https://www.google.com/search?q=D3',
'https://www.google.com/search?q=Vitamin+D+1000']

for link in links:
    # optional: we can wait for the new tab to open by comparing window handles count before & after
    tabs_count_before = len(browser.window_handles)

    # open a link
    control_string = "window.open('{0}')".format(link)
    browser.execute_script(control_string)

    # optional: wait for windows count to increment to ensure new tab is opened
    WebDriverWait(browser, 1).until(lambda browser: tabs_count_before != len(browser.window_handles))

    # get list of currently opened tabs
    tabs_list = browser.window_handles
    print(tabs_list)
    # switch control to newly opened tab (the last one in the list)
    last_tab_opened = tabs_list[len(tabs_list)-1]
    browser.switch_to_window(last_tab_opened)

    # now you can process data on the newly opened tab
    print(browser.title)


for lists in tabs_list:
    last_tab_opened = tabs_list[len(tabs_list)-1]
    browser.switch_to_window(last_tab_opened)
    filtered=[]
    filtered.clear()
    filtered = get_products(link)
    saerched_url.clear()
    if not filtered:
        new_url=link+'+kaufen'
        get_products(link) 
        print('Modified URL :'+link)

    if filtered:
        print(filtered)
        positions.clear()
        for x in range(1, len(filtered)+1):
            positions.append(str(x))
            saerched_url.append(link)

        gobal_position=0
        gobal_position=len(positions)
        print('global postion first: '+str(gobal_position))
        print("\n")

        company_name_list = browser.find_elements_by_xpath("//div[@class='LbUacb']")
        company = []
        company.clear()
        company = [x.text for x in company_name_list]
        print('Company Name:')
        print(company, '\n')


        price_list = browser.find_elements_by_xpath("//div[@class='e10twf T4OwTb']")
        price = []
        price.clear()
        price = [x.text for x in price_list]
        print('Price:')
        print(price)
        print("\n")

        urls=[]
        urls.clear()
        find_href = browser.find_elements_by_xpath("//a[@class='plantl pla-unit-single-clickable-target clickable-card']")
        for my_href in find_href:
            url_list=my_href.get_attribute("href")
            urls.append(url_list)

        print('Final Result: ')
        result = zip(positions,filtered, urls, company,price,saerched_url)
        final_results.clear()
        final_results.append(tuple(result))
        print(final_results)
        print("\n")


        print('global postion end :'+str(gobal_position))
        i=0
        try:
            for d in final_results:

                    while i <= gobal_position:
                      print( d[i])
                      cur.execute("""INSERT into staging.pla_crawler_results(position, product_name, url,company,price,searched_url) VALUES (%s, %s, %s,%s, %s,%s)""", d[i])
                      print('Inserted succesfully')
                      conn.commit()
                      i=i+1
        except (Exception, psycopg2.Error) as error:
                 print (error)
                 pass


    browser.close()

1 Ответ

0 голосов
/ 24 января 2020

В идеале не следует пытаться открыть 50 вкладок одновременно как:


Решение

Если у вас есть Список URL-адресов следующим образом:

['https://selenium.dev/downloads/', 'https://selenium.dev/documentation/en/']

Вы можете выполнить итерацию по списку, чтобы откройте их один за другим в соседней вкладке для очистки с помощью следующей стратегии локатора :

  • код блока:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.common.exceptions import TimeoutException, WebDriverException
    from selenium.webdriver.common.action_chains import ActionChains
    from selenium.webdriver.support.select import Select
    from selenium.webdriver.common.alert import Alert
    from selenium.webdriver.common.keys import Keys
    
    links = ['https://selenium.dev/downloads/', 'https://selenium.dev/documentation/en/']
    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    for link in links:
        driver = webdriver.Chrome(options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
        driver.get(link)
        print(driver.title)
        print("Perform webscraping here")
        driver.quit()
    print("End of program")
    
  • Вывод на консоль:

    Downloads
    Perform webscraping here
    The Selenium Browser Automation Project :: Documentation for Selenium
    Perform webscraping here
    End of program
    

Ссылка

Соответствующее подробное обсуждение можно найти в:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...