Соскоб Zillow Кредитор Профили - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь почерпнуть нужную информацию из профилей кредиторов Zillow на этом сайте: https://www.zillow.com/lender-directory/?sort=Relevance&location=Alabama%20Shores%20Muscle%20Shoals%20AL&language=English&page=1

Я знаю, как почистить информацию красивым супом ... Я просто пытаюсь создать список по кликабельным ссылкам.для каждого профиля, чтобы я мог перейти к каждому ... очистить нужную информацию (я могу сделать это), а затем вернуться на начальную страницу и перейти к следующей ссылке профиля ... возможно, простое решение, но я пытался получить списокчертовски кликабельных ссылок в течение пары часов, и я думаю, что пришло время спросить lol

спасибо

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

from selenium import webdriver
from bs4 import BeautifulSoup
from selenium.webdriver.common.by import By
import time

#Driver to get website...need to get phantomJS going..
driver = webdriver.Chrome(r'C:\Users\mfoytlin\Desktop\chromedriver.exe')
driver.get('https://www.zillow.com/lender-directory/?sort=Relevance&location=Alabama%20Shores%20Muscle%20Shoals%20AL&language=English&page=1')
time.sleep(2)

#Get page HTML data
soup = BeautifulSoup(driver.page_source, 'html.parser')
profile_links = []


profile_links = driver.find_elements_by_xpath("//div[@class='zsg-content-item']//a")
for profile in range(len(profile_links)):
    profile_links = driver.find_elements_by_xpath("//div[@class='zsg-content-item']//a")
    profile_links[profile].click()
    time.sleep(2)
    driver.back()
    time.sleep(2)

Ответы [ 3 ]

0 голосов
/ 26 июня 2019

Параметр find_elements неверен, здесь можно попробовать любое из следующих действий.

Это код, который работает при использовании find_elements ()

def find_elements(self, by=By.ID, value=None):
        """
        Find elements given a By strategy and locator. Prefer the find_elements_by_* methods when
        possible.

        :Usage:
            elements = driver.find_elements(By.CLASS_NAME, 'foo')

        :rtype: list of WebElement
        """
        if self.w3c:
            if by == By.ID:
                by = By.CSS_SELECTOR
                value = '[id="%s"]' % value
            elif by == By.TAG_NAME:
                by = By.CSS_SELECTOR
            elif by == By.CLASS_NAME:
                by = By.CSS_SELECTOR
                value = ".%s" % value
            elif by == By.NAME:
                by = By.CSS_SELECTOR
                value = '[name="%s"]' % value

        # Return empty list if driver returns null
        # See https://github.com/SeleniumHQ/selenium/issues/4555
        return self.execute(Command.FIND_ELEMENTS, {
            'using': by,
            'value': value})['value'] or []

Попробуйте любой из следующих вариантов

profile_links = driver.find_elements_by_xpath("//div[@class='zsg-content-item']//a")

OR

profile_links = driver.find_elements(By.XPATH,"//div[@class='zsg-content-item']//a") 

Вот список, когда вы используете вышеуказанный код.

['https://www.zillow.comhttps://www.zillow.com/lender-profile/courtneyhall17/', 'https://www.zillow.comhttps://www.zillow.com/lender-profile/SouthPointBank/', 'https://www.zillow.comhttps://www.zillow.com/lender-profile/kmcdaniel77/', 'https://www.zillow.comhttps://www.zillow.com/lender-profile/jdowney75/', 'https://www.zillow.comhttps://www.zillow.com/lender-profile/fredabutler/', 'https://www.zillow.comhttps://www.zillow.com/lender-profile/justindorroh/', 'https://www.zillow.comhttps://www.zillow.com/lender-profile/aball731/', 'https://www.zillow.comhttps://www.zillow.com/lender-profile/1stfedmort/', 'https://www.zillow.comhttps://www.zillow.com/lender-profile/tstutts/', 'https://www.zillow.comhttps://www.zillow.com/lender-profile/sbeckett0/', 'https://www.zillow.comhttps://www.zillow.com/lender-profile/DebiBretherick/', 'https://www.zillow.comhttps://www.zillow.com/lender-profile/cking313/', 'https://www.zillow.comhttps://www.zillow.com/lender-profile/Gregory%20Angus/', 'https://www.zillow.comhttps://www.zillow.com/lender-profile/cbsbankmarketing/', 'https://www.zillow.comhttps://www.zillow.com/lender-profile/ajones392/', 'https://www.zillow.comhttps://www.zillow.com/lender-profile/sschulte6/', 'https://www.zillow.comhttps://www.zillow.com/lender-profile/dreamhomemortgagellc/', 'https://www.zillow.comhttps://www.zillow.com/lender-profile/DarleenBrooksHill/', 'https://www.zillow.comhttps://www.zillow.com/lender-profile/sjones966/', 'https://www.zillow.comhttps://www.zillow.com/lender-profile/BlakeRobbins4/', 'https://www.zillow.comhttps://www.zillow.com/lender-profile/zajones5746/', 'https://www.zillow.comhttps://www.zillow.com/lender-profile/adeline%20perkins/']

Отредактировано

Как я уже сказал, вам нужно заново назначить элемент.

    profile_links = driver.find_elements_by_xpath("//div[@class='ld-lender-info-column']//h2//a")
for profile in range(len(profile_links)):
    profile_links = driver.find_elements_by_xpath("//div[@class='ld-lender-info-column']//h2//a")
    driver.execute_script("arguments[0].click();", profile_links[profile])
    time.sleep(2)
    driver.back()
    time.sleep(2)
0 голосов
/ 26 июня 2019

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

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

url = 'https://www.zillow.com/lender-directory/?sort=Relevance&location=Alabama%20Shores%20Muscle%20Shoals%20AL&language=English&page=1'

with webdriver.Chrome() as driver:
    wait = WebDriverWait(driver,10)
    driver.get(url)
    items = [item.get_attribute("href") for item in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,"h2 > a[href^='/lender-profile/']")))]
    for profilelink in items:
        driver.get(profilelink)
        name = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "h1.lender-name"))).text
        print(name)
0 голосов
/ 26 июня 2019

Вы можете найти все интерактивные ссылки, используя этот подход. Это написано на Java. Вы можете написать эквивалент в Python.

   List<WebElement> Links = driver.findElements(By.xpath("//div[@class='zsg-content-item']//a"));
    ArrayList<String> capturedLinks = new ArrayList<>();

    for(WebElement link:Links)
    {
        String myLink = "https://www.zillow.com"+ link.getAttribute("href")
        if(!capturedLinks.contains(myLink)) //to avoid duplicates
        {
        capturedLinks.add(myLink);
        }
    }
...