【问题标题】:Odd behavior with Selenium while scraping抓取时 Selenium 的奇怪行为
【发布时间】:2023-03-17 11:49:02
【问题描述】:

我有一个脚本,可以从网页中提取网址、加载每个链接并提取我需要的数据。然而,经过进一步调查,我发现 Selenium 没有按应有的方式打开链接,并且正在复制信息。例如如下:

link 1 - Title:ABC <-- within link, extract 123
link 2 - Title:DEF <-- within link, extract 456
link 3 - Title:GHI <-- within link, extract 789
link 4 - Title:JKL <-- within link, extract 000

输出应该如下:

ABC, 123
DEF, 456
GHI, 789
JKL, 000

但是我得到的输出如下:

ABC, 123
ABC, 123
GHI, 789
JKL, 000

这种行为似乎是随机的。

这里是代码

elems = driver.find_elements_by_xpath(alllinks)
for elem in elems:
    links.append(elem.get_attribute("href"))
    for url in links:
        try:
            time.sleep(0.5) 
            driver.get(url) 
            time.sleep(2)

有人遇到过这种行为吗?

编辑:更新:

对此的更新,我只抓取了 URL 的 3 次,并将结果相互比较。 URL 是唯一的,并根据站点提取。 据我所知,它是 Selenium 从数组中加载 URL 的方式。

【问题讨论】:

  • 确保在加载 url 时进行适当的同步。我觉得你的脚本在页面加载完成之前从第二个链接加载中获取了信息,这就是为什么你得到了第一个链接的重复信息。
  • 有道理,您是否建议在页面加载后使用 time.sleep(x) 来复制 URL,或者是否有我可以使用的 python / selenium 特定命令?
  • 您是否使用driver.get() 进行网址导航?加载页面后,所有页面之间是否有任何共同元素?
  • 发布您的代码!不是每个人都能读心术
  • 我将所有抓取的 URL 附加到一个变量中,然后在 for 循环中使用 driver.get() 命令遍历每个项目。代码sn-p如下:elems = driver.find_elements_by_xpath(alllinks) for elem in elems: links.append(elem.get_attribute("href")) for url in links: try: time.sleep(0.5) driver.get(url) time.sleep(2)

标签: python python-2.7 selenium selenium-webdriver selenium-chromedriver


【解决方案1】:

如果我正确理解您的查询,您应该加载最新的 href,而不是每次都遍历所有 href。

elems = driver.find_elements_by_xpath(alllinks)
previousTitle = ''
for elem in elems:
    url = elem.get_attribute("href")
    links.append(url)
    driver.get(url) 
    # make sure to wait until the title is changed (no issue until 2 urls have same title)
    wait.until_not(EC.title_is(previousTitle)) 
    previousTitle = driver.title

【讨论】:

  • 我认为同步没有问题,因为我运行了我的脚本 3 次,并且所有 3 次的输出都在随机点重复。此外,最后一个链接没有重复,这表明在加载第一个链接以开始提取之前加载了完整的 URL 列表
【解决方案2】:

我想我会回答我的问题。这不是 Selenium 的问题,而是我的代码的问题。 我有一个 try/except 代码块,如果元素存在,它将执行,如果存在,变量将附加提取的文本。但是,如果该元素不存在,则该变量将包含上一个循环中的文本并将其写入文件。

为了规避这个问题,我在 for 循环的末尾有一个 del - 可能还有其他更优雅的方法可以做到这一点,但它确实解决了我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多