如何让我的 python selenium 脚本在最小化时工作?

问题描述 投票:0回答:1

我有一个 python 脚本,可以读取 input_names.csv,其中包含姓名和邮政编码。使用此信息,程序使用 selenium 打开 chrome,将其最小化,并将信息输入到白页中,以便获取地址和电话。不幸的是,程序最小化后无法运行。

我已尝试从

visibility_of_element_located()
切换到
element_to_be_clickable
,但仍然不起作用。

这是我的代码:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
import undetected_chromedriver as uc
import time
import csv
import setuptools

driver = uc.Chrome(use_subprocess=True)

def scrape_white_pages(name, zip_code):
    global driver

    driver.get("https://www.whitepages.com/person")

    try:
        # Wait for the address input field to be present and interactable
        name_input = WebDriverWait(driver, 20).until(
            EC.visibility_of_element_located((By.XPATH, '//*[@id="search-address"]'))
        )
        name_input.clear()  # Clear any existing text in the input field
        name_input.send_keys(name)

        # Wait for the zip code input field to be present and interactable
        zip_code_input = WebDriverWait(driver, 20).until(
            EC.element_to_be_clickable((By.XPATH, '//*[@id="search-location"]'))
        )
        zip_code_input.clear()  # Clear any existing text in the input field
        zip_code_input.send_keys(zip_code)

        name_input.send_keys(Keys.RETURN)

        time.sleep(3)  # Adjust sleep time as needed

        # Check if owner name and phone number elements are present
        elements = driver.find_elements("class name", "faq-question")

        WebDriverWait(driver, 10).until(EC.element_to_be_clickable(elements[0])).click()
        address = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="faq-0"]'))).text.strip()
        address = address[address.index("is") + 3:address.index(".")]

        WebDriverWait(driver, 10).until(EC.element_to_be_clickable(elements[1])).click()
        phone_number = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="faq-1"]'))).text.strip()
        phone_number = phone_number[phone_number.index("is") + 3:phone_number.index(".")]

    except Exception as e:
        print(f"An error occurred: {e}")

    return address, phone_number

def save_to_csv(data, filename='owner_info.csv'):
    with open(filename, 'a', newline='') as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(data)

def main():
    names = []
    zip_codes = []
    #address = input("Enter address line 1: ")
    #zip_code = input("Enter ZIP code: ")
    with open("input_names.csv", "r") as file:
        lines = csv.reader(file)
        for line in lines:
            if line != '':
                if "Name" not in line and line[0] != "":
                    names.append(line[0])
                    zip_codes.append(line[1])
        file.close()
    counter = 0
    driver.get('https://www.google.com')
    driver.minimize_window()
    for i in names:
        name = names[counter]
        zip_code = zip_codes[counter]
        address, phone_number = scrape_white_pages(name, zip_code)
        if len(list(phone_number)) < 15:
            if address and phone_number:
                print(f"Address: {address}")
                print(f"Phone Number: {phone_number}")
                # Save data to CSV file
                save_to_csv([address, zip_code, phone_number, name[:name.index(" ")], name[name.index(" "):].replace(" ", "")])
            else:
                print("Address information not found.")
            counter += 1
        elif address and phone_number:
            print(f"Address: {address}")
            print(f"Phone Number: None Found")
            # Save data to CSV file
            save_to_csv([address, zip_code, "N/A", name[:name.index(" ")], name[name.index(" "):].replace(" ", "")])
        counter += 1
    driver.close()

if __name__ == "__main__":
    main()

python windows google-chrome selenium-webdriver selenium-chromedriver
1个回答
0
投票

如果您不希望 Selenium 对用户可见。您可以无头使用selenium。 (请参阅无头浏览器)。您可以通过在初始化驱动程序时传递以下选项来完成此操作:

from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--headless')

driver = uc.Chrome(use_subprocess=True, options=options)

在下面的代码片段中,我创建了一个查找函数,它接受一个名称并返回白页中的第一个地址。但是,如果标记了“--headless”选项,则不会弹出浏览器。

options = Options()
options.add_argument('--headless')


def lookup(driver: webdriver.Chrome, name: str):
    driver.get("https://www.whitepages.com/person")
    name_field = WebDriverWait(driver, 20).until(
        EC.visibility_of_element_located((By.XPATH, '//*[@id="search-address"]'))
    )
    name_field.clear()
    name_field.send_keys(name)
    name_field.send_keys(Keys.RETURN)

    time.sleep(2)

    elements = driver.find_elements("class name", "faq-question")

    WebDriverWait(driver, 10).until(EC.element_to_be_clickable(elements[0])).click()
    address = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="faq-0"]'))).text.strip()
    address = address[address.index("is") + 3:address.index(".")]

    return address

if __name__ == "__main__":
    svc = webdriver.ChromeService(executable_path=binary_path)
    driver = webdriver.Chrome(service=svc, options=options)
    johns_address = lookup(driver, "John Smith")
    print(johns_address)

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.