我有一个 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()
如果您不希望 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)
希望有帮助。