【问题标题】:Getting availability from datepicker for x months for a site从日期选择器获取站点 x 个月的可用性
【发布时间】:2016-05-03 16:58:34
【问题描述】:

我试图通过单击日期选择器日历中的下一步按钮来获取 airbnb 中每一天的可用性/价格,但没有运气。

我当前的代码是这样的:

def handle(self, *args, **options):
    def airbnb():
        display = Display(visible=0, size=(1024, 768))
        display.start()
        driver = webdriver.Firefox()
        driver.maximize_window()
        driver.get("https://www.airbnb.pt/rooms/265820")

        # wait for the check in input to load
        wait = WebDriverWait(driver, 10)
        elem = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.book-it-panel input[name=checkin]")))
        elem.click()

        # wait for datepicker to load
        wait.until(
            EC.visibility_of_element_located((By.CSS_SELECTOR, '.ui-datepicker:not(.loading)'))
        )

        days = driver.find_elements_by_css_selector(".ui-datepicker table.ui-datepicker-calendar tr td")
        for cell in days:
            day = cell.text.strip()
            if not day:
                continue

            if "ui-datepicker-unselectable" in cell.get_attribute("class"):
                status = "Unavailable"
            else:
                status = "Available"

            price = "n/a"
            if status == "Available":
                # hover the cell and wait for the tooltip
                ActionChains(driver).move_to_element(cell).perform()
                price = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, '.datepicker-tooltip'))).text

            print(day, status, price)

他们都工作,但只有 1 个月。我希望能够设置 X 个月。例如对于homeaway,我在第一次打开日历点击后尝试使用self.driver.find_element_by_css_selector('.ui-datepicker-next.ui-corner-all').c‌​lick(),但我得到了ElementNotVisibleException

提前致谢

【问题讨论】:

    标签: python selenium datepicker


    【解决方案1】:

    首先,我会找到带有a.ui-datepicker-next CSS 选择器的“下个月”按钮,该选择器既可读又可靠。

    这里是实现 - 处理与 MONTH_COUNT 变量定义一样多的月份:

    from selenium import webdriver
    from selenium.webdriver import ActionChains
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    
    MONTH_COUNT = 3
    
    driver = webdriver.Firefox()
    driver.maximize_window()
    driver.get("https://www.airbnb.pt/rooms/265820")
    
    # wait for the check in input to load
    wait = WebDriverWait(driver, 10)
    elem = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.book-it-panel input[name=checkin]")))
    elem.click()
    
    # iterate over the month count
    for month in range(MONTH_COUNT):
        # wait for datepicker to load
        wait.until(
            EC.visibility_of_element_located((By.CSS_SELECTOR, '.ui-datepicker:not(.loading)'))
        )
    
        # getting current month for displaying purposes
        current_month = driver.find_element_by_css_selector(".ui-datepicker-month").text
        print(current_month)
    
        # iterate over days
        days = driver.find_elements_by_css_selector(".ui-datepicker table.ui-datepicker-calendar tr td")
        for cell in days:
            day = cell.text.strip()
            if not day:
                continue
    
            if "ui-datepicker-unselectable" in cell.get_attribute("class"):
                status = "Unavailable"
            else:
                status = "Available"
    
            price = "n/a"
            if status == "Available":
                # hover the cell and wait for the tooltip
                ActionChains(driver).move_to_element(cell).perform()
                price = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, '.datepicker-tooltip'))).text
    
            print(day, status, price)
    
        print("-----")
        # click next month
        driver.find_element_by_css_selector("a.ui-datepicker-next").click()
    
    driver.close()
    

    打印:

    Maio
    (u'1', 'Unavailable', 'n/a')
    (u'2', 'Unavailable', 'n/a')
    (u'3', 'Unavailable', 'n/a')
    ...
    (u'30', 'Unavailable', 'n/a')
    (u'31', 'Unavailable', 'n/a')
    -----
    Junho
    (u'1', 'Unavailable', 'n/a')
    (u'2', 'Unavailable', 'n/a')
    (u'3', 'Unavailable', 'n/a')
    ...
    (u'28', 'Unavailable', 'n/a')
    (u'29', 'Unavailable', 'n/a')
    (u'30', 'Unavailable', 'n/a')
    -----
    Julho
    (u'1', 'Unavailable', 'n/a')
    (u'2', 'Unavailable', 'n/a')
    (u'3', 'Unavailable', 'n/a')
    ...
    (u'29', 'Unavailable', 'n/a')
    (u'30', 'Available', u'\u20ac36')
    (u'31', 'Available', u'\u20ac36')
    -----
    

    【讨论】:

    • 它适用于 airbnb,但对于 homeaway 来说似乎更复杂,因为我们必须使用 2 个日历才能获得价格.. 你对那个有什么建议吗?
    • 我尝试在first_available_date 之后添加一个driver.find_element_by_css_selector("a.ui-datepicker-next").click(),在end_date 之后添加另一个ElementNotVisibleException
    • 你想让我用我正在为 airbnb 尝试的完整代码更新我的问题吗?
    • @psychok7 等等,您现在对homeaway 或我为airbnb 提供的代码有困难吗?谢谢。
    • 这个问题是针对airbnb和homeaway的,因为我遇到了类似的问题。你回答了airbnb,它工作得很好,我尝试将同样的想法应用于homeaway代码(女巫也在描述中)但我得到了我在cmets中发布的错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 2018-02-01
    • 2012-01-14
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多