#python #selenium #web-scraping #beautifulsoup
Вопрос:
Этот код даст мне адрес, но не даст номер телефона
import requests
from bs4 import BeautifulSoup
headers ={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36'}
r=requests.get('https://www.houzz.com/professionals/general-contractor')
soup=BeautifulSoup(r.content, 'html.parser')
tra = soup.find_all('div',class_='hz-pro-search-result__info')
for pro in tra:
address=pro.find('span',class_='hz-pro-search-result__location-info__text').text
try:
phone=pro.select('div.hz-pro-search-result__right-info__contact-info > span > span').text
except:
phone=''
print(address,phone)
Возьмите данные Phone Number
из этой ссылки на странице https://www.houzz.com/professionals/general-contractor
<div class="hz-pro-search-result__right-info__contact-info"><span class="hz-pro-search-result__contact-info"><span class="icon-font icon-phone hz-pro-search-result__contact-info__icon" aria-hidden="true"></span>(800) 310-7154</span></div>
<span class="hz-pro-search-result__contact-info"><span class="icon-font icon-phone hz-pro-search-result__contact-info__icon" aria-hidden="true"></span>(800) 310-7154</span>
Комментарии:
1. Вам может понадобиться селен, так как мы получаем номер телефона только после нажатия этой
View Phone Number
кнопки2. Я пробовал селен, что
click
номер телефона и дать номер телефона, но это не работает для меня3. вы тоже можете дать этот код?
4. они ничего не дают
5. нет, просто дайте код, в котором вы пытались использовать selenium
Ответ №1:
Веб-сайту необходимо, чтобы вы нажали на кнопку «Просмотреть номер телефона», чтобы открыть номер телефона. Для этого вы можете использовать Селен. Я также использую панд, но вы можете пропустить это, если хотите.
Установите Selenium:
pip install selenium
Установите драйвер Selenium для вашей версии Chrome
Установите панд:
pip install pandas
Вот код:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import time
import pandas as pd
# location of chromedriver.exe
driver = webdriver.Chrome("D:/chromedriver/94/chromedriver.exe")
# opening website
driver.get("https://www.houzz.com/professionals/general-contractor")
# waiting for the DIVs to load
WebDriverWait(driver, 60).until(EC.presence_of_element_located((By.XPATH, '//div[@class="hz-pro-search-result__right-info"]')))
# getting all the relevant DIVs
info_divs = driver.find_elements(By.XPATH, '//div[@class="hz-pro-search-result__right-info"]')
house_details = {
"address": [],
"phone": []
}
for row in info_divs:
try:
address = row.find_element(By.CLASS_NAME, "hz-pro-search-result__right-info__full-address")
phone = row.find_element(By.CLASS_NAME, "hz-pro-search-result__right-info__contact-info")
phone.click()
time.sleep(0.5)
house_details['address'].append(address.text)
house_details['phone'].append(phone.text)
except Exception as ex:
print(f"something went wrong. {ex}")
# saving to dataframe
house_df = pd.DataFrame.from_dict(house_details)
# exporting to .csv
house_df.to_csv('house_details.csv', index=False)
print(house_df)