Не могу извлечь правильно / вся информация нужна - PullRequest
0 голосов
/ 01 июля 2019

Я пытаюсь получить информацию о номере мобильного / служебного телефона с этого сайта: https://www.zillow.com/lender-profile/DougShoemaker/

Я пытался поиграться с bs4, но я могу получить только первый номер телефона.Я пытаюсь получить как офисные, так и мобильные номера.

from selenium import webdriver
from bs4 import BeautifulSoup
import time


#Chrome webdriver filepath...Chromedriver version 74
driver = webdriver.Chrome(r'C:\Users\mfoytlin\Desktop\chromedriver.exe')
driver.get('https://www.zillow.com/lender-profile/DougShoemaker/')
soup = BeautifulSoup(driver.page_source, 'html.parser')
time.sleep(2)
phoneNum = driver.find_element_by_class_name('zsg-list_definition')
trial = phoneNum.find_element_by_class_name('zsg-sm-hide')
print(trial.text)

Ответы [ 3 ]

2 голосов
/ 01 июля 2019

Вам не нужно использовать Selenium или даже BeautifulSoup.Если вы проверяете сетевые запросы от Developer Tools (F12) > Network, вы можете видеть, что данные выбираются с использованием XHR-запроса

enter image description here

Вы можете сделать этот запрос самостоятельно и использоватьответ JSON в любом случае.

POST https://mortgageapi.zillow.com/getRegisteredLender?partnerId=RD-CZMBMCZ
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0
Referer: https://www.zillow.com/lender-profile/DougShoemaker/
Content-Type: application/json

{
  "fields": [
    "aboutMe",
    "address",
    "cellPhone",
    # ... other fields
    "website"
  ],
  "lenderRef": {
    "screenName": "DougShoemaker"
  }
}

Теперь с библиотекой requests вы можете попробовать:

import requests

if __name__ == '__main__':
    payload = {
        "fields": [
            "screenName",
            "cellPhone",
            "officePhone",
            "title",
        ],
        "lenderRef": {
            "screenName": "DougShoemaker"
        }
    }

    res = requests.post('https://mortgageapi.zillow.com/getRegisteredLender?partnerId=RD-CZMBMCZ',
                        json=payload)
    res.raise_for_status()
    data = res.json()

    cellphone, office_phone = data['lender']['cellPhone'], data['lender']['officePhone']
    cellphone_num = '({areaCode}) {prefix}-{number}'.format(**cellphone)
    office_phone_num = '({areaCode}) {prefix}-{number}'.format(**office_phone)
    print(office_phone_num, cellphone_num)

, которая печатает:

(618) 619-4120 (618) 795-0790
0 голосов
/ 01 июля 2019

Чтобы извлечь номер Office , Cell и Fax , вам нужно ввести WebDriverWait для visibility_of_element_located(), и вы можетеиспользуйте одну из следующих стратегий локатора :

  • Блок кода:

    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
    
    options = webdriver.ChromeOptions()
    options.add_argument('start-maximized')
    # options.add_argument('disable-infobars')
    options.add_argument('--disable-extensions')
    driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
    driver.get('https://www.zillow.com/lender-profile/DougShoemaker/')
    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//dt[text()='Office']//following::dd[1]//span"))).get_attribute("innerHTML"))
    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//dt[text()='Cell']//following::dd[1]//span"))).get_attribute("innerHTML"))
    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//dt[text()='Fax']//following::dd[1]//span"))).get_attribute("innerHTML"))
    
  • Выход на консоль:

    (618) 619-4120
    (618) 795-0790
    (618) 619-4120
    
0 голосов
/ 01 июля 2019

попробуйте следовать xpath для каждого номера телефона

Office Phone:
//dt[contains(text(),'Office')]/following-sibling::dd/div/span
Cell Phone:
//dt[contains(text(),'Cell')]/following-sibling::dd/div/span
Fax Number:
//dt[contains(text(),'Fax')]/following-sibling::dd/div/span
...