浏览器自动抓取:由于下拉式/自动完成的输入框,不可能的页面?

2024-06-14 04:36:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为一个论文项目搜集飞行数据。特别是来自STA Travel。我没有太多的经验,但我已经做了一些类似的小任务,与其他网页,从来没有问题。但有些东西(很多东西?)在制作这一页的过程中,这项任务似乎不可能完成。在

我目前所做的努力:

  • Python和Selenium以及Chrome、Geckodriver(Mozilla)和PhantomJS
  • 带有CasperJS和PhantomJS的Javascript

对于CasperJS和Phantom JS,我甚至无法使用给定的简短且看似直接的代码填充第一个文本框here。在

对于Python和Selenium,我得到了更进一步的理解,但是,据我所知,所有失败的主要原因是输入框的实现。只要您在其中键入内容,就会打开一个动态下拉菜单,提示自动完成结果。如果您没有正确地单击其中一个,并且在键入后单击离开框,则框会自动清除其文本。这些东西让人感觉就像是抹了油的肥皂——不管你怎么抓它们,它们都会滑出你的控制范围。在

为了演示,下面是一些简单的可运行代码(假设您安装了Python、Selenium和geckodriver)。在

# import selenium driver and helpers
from selenium import webdriver

# set browser driver
driver = webdriver.Firefox()

# open url
driver.get(url)
driver.implicitly_wait(30)

# select forms
depart_input = driver.find_element_by_css_selector(".flight_depart_location.ui-autocomplete-input")
destin_input = driver.find_element_by_css_selector(".flight_arrive_location.ui-autocomplete-input")

# send text
depart_input.send_keys(u"Zürich, Schweiz, ZRH")
destin_input.send_keys(u"Peking Int'l Apt, China, PEK")

您将看到,第一个输入在第二个输入被填充后再次被删除。我已经尝试了所有我能在网上找到的技巧,比如通过点击激活元素来设置它,只是发送Keys.ENTER/RETURN键从一个盒子移到另一个盒子。但这个网站对我来说似乎是“不自动化的”。我相信解决办法也许不那么难,但我自己找不到。所以,如果有人知道如何自动处理和刮取这个页面,我会非常感谢。不管解决方案看起来如何(Python、Javascript。。。其他的)。在

谢谢你!在


Tags: 代码importsendurlinput键入driverselenium
1条回答
网友
1楼 · 发布于 2024-06-14 04:36:42

你想用下拉框的位置来显示你想要的位置。然后您可以查找包含所需位置的A标记并单击它。您在到达和离开区域都这样做。任何类似这样的东西,你可能会重用,你应该把它放到一个函数中。在

既然你用任何语言都要这个,我就用Java给你。您应该能够非常容易地将其转换为python。在

功能

public static void setArrival(String arrival)
{
    driver.findElement(By.cssSelector(".flight_arrive_location.ui-autocomplete-input")).sendKeys(arrival);
    new WebDriverWait(driver, 3).until(ExpectedConditions.elementToBeClickable(By.xpath("//a[contains(.,'" + arrival + "')]"))).click();
}

public static void setDeparture(String departure)
{
    driver.findElement(By.cssSelector(".flight_depart_location.ui-autocomplete-input")).sendKeys(departure);
    new WebDriverWait(driver, 3).until(ExpectedConditions.elementToBeClickable(By.xpath("//a[contains(.,'" + departure + "')]")))
            .click();
}

剧本

^{pr2}$

相关问题 更多 >