python - 从日期选择器获取网站 x 个月的可用性

标签 python selenium datepicker

我试图通过点击日期选择器日历中的下一个按钮来获取爱彼迎每天的空房情况/价格,但没有成功。

我当前的代码类似于:

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 个月。例如,对于回家,我在第一次打开日历点击后尝试使用 self.driver.find_element_by_css_selector('.ui-datepicker-next.ui-corner-all').c‌​lick() 但我出现 ElementNotVisibleException

提前致谢

最佳答案

首先,我将使用 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')
-----

关于python - 从日期选择器获取网站 x 个月的可用性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37010064/

相关文章:

java - 如何验证输入到 DatePicker 中的日期?

python - 解决错误TypeError : __init__() takes 1 positional argument but 2 were given

python - 多个线程相互通信

python - scrapy蜘蛛: output in chronological order

xpath - Css 选择器等效于 '//div[contains(@class, ' a b') 而不是 (contains(@style, 'c' ))]'

java - 使用 selenium 时,尽管切换了框架,但确实无法在 Indeed 上弹出框架时单击任何内容

python - Selenium Firefox headless 返回不同的结果

jquery - 使用 setdate 为 jQueryUI datepicker 创建 '< previous' 和 'next >'(日期)链接时出错

javascript - 更改 Material UI 选择器上的工作日标签

python - 将输入列表中的字典元素附加到元组列表