【问题标题】:Selenium Python script only scrapes part of the visible informationSelenium Python 脚本仅抓取部分可见信息
【发布时间】:2021-05-02 20:44:48
【问题描述】:

很抱歉,当您访问以下网站时,标题可以更好地描述问题:

右侧有一条文字,上面写着“查看全部”。单击该链接后,将弹出指向各种分叉的链接列表。我正在尝试抓取这些分叉的超链接。

一个问题是,刮板不仅会刮取分叉的链接,还会刮取配置文件的链接。他们不为这些链接使用特定的类或 ID。所以我编辑了我的脚本来计算哪个结果是正确的,哪个不是。那部分有效。然而,该脚本只抓取了几个链接,并没有抓取其他链接。这让我很困惑,因为起初我认为这是由于元素对硒不可见引起的,因为存在滚动。然而,这似乎不是问题,因为其他未抓取的链接通常是可见的。该脚本仅抓取前 5 个链接并完全跳过其余链接。

我现在不确定该怎么做,因为代码本身没有任何可能的问题的错误或警告。

这是抓取链接的一小段代码。

driver.get(url)

wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, "button.see-all-forks"))).click()
fork_count = wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, "span.jsx-3602798114"))).text
forks = wait.until(ec.presence_of_all_elements_located((By.CSS_SELECTOR, "a.jsx-2470659356")))
j = 1
for i, fork in enumerate(forks):
    if j == 1:
        forks[i] = fork.get_attribute("href")
        print(forks[i])
    if j == 3:
        j = 1
    else:
        j += 1

在这种情况下,“url”变量是我在上面提供的链接。然后循环在每个结果之后跳过 3 个结果,因为每 4 个结果都是正确的。我尝试使用 XPath 使用“包含”功能过滤掉结果,但是名称会随着用户自己命名而有所不同,因此据我所知,这是过滤掉结果的唯一方法。

这是我得到的输出。

在此之后不会打印任何结果,并且程序会终止而不会出现错误。这里发生了什么,我错过了什么?我很困惑为什么 Selenium 只抓取五个结果,然后终止。

编辑注释 - 我的代码解释:

我已经设置了 if 语句来检查每 4 个结果,因为它是正确的,但第一个也是正确的。如果 "j!=3" 则在 "j=3" (现在出现结果)后将 1 加到 "j" 上,如果 "j=1" 运行代码并打印正确的结果。所以正确的结果总是“j=1”。

【问题讨论】:

    标签: python selenium selenium-webdriver web-scraping webdriver


    【解决方案1】:

    这里的问题是,一旦出现至少一个元素,您在此处使用的所有预期条件都会通过。
    所以

    forks = wait.until(ec.presence_of_all_elements_located((By.CSS_SELECTOR, "a.jsx-2470659356")))
    

    并没有像字面上那样捕获所有元素,而是......你永远不知道有多少,但至少有一个。
    这就是您的forks 列表如此短的原因。
    解决这个问题的最简单方法是在wait.until(ec.presence_of_all_elements_located((By.CSS_SELECTOR, "a.jsx-2470659356"))) 之后添加一些硬编码的睡眠,然后才能获取元素列表。
    详情请参阅this 帖子。

    在 Java 中,有一个预期条件 numberOfElementsToBeMoreThan,因此它可以在条件超过 95 等的情况下在这里使用,但在 Python 中,预期条件列表要短得多,并且没有这样的选项... .

    【讨论】:

    • 我已经编辑了我的代码并在等待元素加载之前添加了 sleep(5)。这很有效,我得到了大量的结果。但是现在由于某些原因,前 10-15 个结果有重复,请参阅此输出:例如此链接:replit.com/@MAORtk123/Customizable-Discord-Bot-14 被打印两次。在前 10-15 个结果之后,所有链接都是唯一的并按预期显示。一旦出现睡眠,你知道什么可能导致这种情况吗?不过感谢您的帮助。
    • 我认为您使用了错误的定位器。尝试使用以下 xpath //div[@aria-modal='true']//*[@class='jsx-2470659356 fork-card']/a 或者如果您更喜欢 css selector [aria-modal='true'] div.jsx-2470659356.fork-card>a 这正好给出 100 个结果。顺便说一句,延迟 1 秒就绰绰有余了,没必要睡 5 秒
    • 您的 XPath 选择器工作完美,甚至不需要我无用的过滤器。我很惊讶我自己无法想出它......无论如何,结果现在是完美的并且不包含任何重复,所以再次感谢你帮助我!我已将您的答案标记为正确的答案。
    • 很高兴能为您提供帮助!谢谢!
    猜你喜欢
    • 2021-05-08
    • 2021-11-05
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多