【问题标题】:Unable to click on links cyclically from a webpage无法从网页循环点击链接
【发布时间】:2018-04-28 09:30:34
【问题描述】:

我在 python 中结合 selenium 编写了一个脚本,以从网页循环单击几个链接。首先,爬虫应该点击登录页面上的搜索按钮(不更改搜索字段中的任何内容)以填充结果。

第一步:

当结果显示时,抓取工具应该点击我尝试在第一张图片中显示的每个链接。 单击任何链接后,会弹出一个包含更多信息的框。

第二步:

在弹出框中,有几个选项卡隐藏了更多信息,这些信息在单击时会显示出来(新选项卡在图 3 中可见)。

最后:

但是,抓取工具会继续执行相同的操作,直到所有链接都用尽为止。

我尝试过的几乎可以完成所有事情。它执行上述所有步骤一次(对于第一个链接),但对于第二个链接,刮板卡在我的脚本的最后一行抛出 timeout exception 错误。任何帮助使它成功的人都将受到高度赞赏。

网址:site link

这是我迄今为止尝试过的:

from selenium import webdriver ; import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
wait = WebDriverWait(driver, 10)
driver.get("https://www.mspa-ea.org/search-mspa-companies.html")

wait.until(EC.element_to_be_clickable((By.ID, "element-button"))).click() #clicking on search button
for post in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".company a"))):
    post.click() #clicking on each links shown in image one
    time.sleep(2)
    try:
        for elem in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".memberDetail .informationContainer ul li"))):
            elem.click() #clicking on tabs cyclically
            time.sleep(2)
    except:
        pass
    wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".memberDetail .closeDetail"))).click()
    #close the pop up box.
    #timeout exception throws here when it cycles for the second time

但是,在对单个链接执行所有这些操作后,当另一个链接重复该操作时,它会打开弹出框,而不是单击选项卡,而是直接点击最后一行并抛出 timeout exception。此外,我无法摆脱在我的爬虫中定义的硬编码延迟。

图片如下(一二三依次):

https://i.stack.imgur.com/RLvVY.jpg

https://i.stack.imgur.com/OK2R4.jpg

https://i.stack.imgur.com/o7pG5.jpg

【问题讨论】:

    标签: python python-3.x selenium web-scraping selenium-chromedriver


    【解决方案1】:

    当我运行您的代码时,我没有在调用 click 时收到异常,而是在以下行中收到异常:

    for elem in wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, ".memberDetail .informationContainer ul li"))):
    

    这一行没有做你想做的事 - 选择器将返回页面上的 所有 <li> 标签元素(大约 5000 个),而不仅仅是您打开的帖子中包含的内容。

    由于大多数<li> 元素不可见(因为包含它们的弹出窗口已关闭),因此您对visibility_of_all_elements_located 的调用将超时。

    您需要将上面的代码行替换为仅返回 <li> 选项卡元素的代码行,这些选项卡元素是当前打开的 post WebElement 的后代。

    【讨论】:

    • 这个问题可以通过使用presence 代替visibility 来解决,如for elem in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".memberDetail .informationContainer ul li")))。但是,当点击这些选项卡时,浏览器无法关闭弹出框以转到下一个链接。
    猜你喜欢
    • 2016-12-04
    • 2015-09-14
    • 2012-05-25
    • 2020-03-25
    • 2016-03-21
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多