我的脚本一次又一次地解析无限滚动网页中的所有链接

My script parses all the links again and again from a infinite scrolling webpage

我已经使用 python 结合 selenium 编写了一个脚本,以从网页中获取所有公司链接,该网页在滚动到最下方之前不会显示所有链接。但是,当我 运行 我的脚本时,我得到了想要的链接,但是有很多重复项被删除了。此时,我不知道如何修改我的脚本以获得唯一链接。这是我到目前为止尝试过的方法:

from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('http://fortune.com/fortune500/list/')
while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(3)

    for items in driver.find_elements_by_xpath("//li[contains(concat(' ', @class, ' '), ' small-12 ')]"):
        item = items.find_elements_by_xpath('.//a')[0]
        print(item.get_attribute("href"))

driver.close()

我不知道 python 但我知道你做错了什么。希望您能够自己找出代码 ;)

每次向下滚动时,页面都会添加 50 个链接,直到有 1000 个链接。好吧几乎...它从 20 个链接开始,然后每次添加 30 个,然后每次添加 50 个,直到有 1000 个。

你的代码现在打印的方式是:

前20个链接。

第一个 20 又是下一个 30。

前50个+后50个

等等...

您真正想要做的只是向下滚动页面,直到您拥有页面上的所有链接,然后然后 打印它们。希望对您有所帮助。

这是更新后的 Python 代码(我检查过它并且有效)

from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('http://fortune.com/fortune500/list/')


while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(5)
    listElements = driver.find_elements_by_xpath("//li[contains(concat(' ', @class, ' '), ' small-12 ')]//a")
    print(len(listElements))
    if (len(listElements) == 1000):
        break

for item in listElements:
    print(item.get_attribute("href"))

driver.close()

如果您希望它运行得更快一些,您可以将 "time.sleep(5)" 换成 Anderson 的等待语句

您可以试试下面的代码:

from selenium.webdriver.support.ui import WebDriverWait as wait 
from selenium.common.exceptions import TimeoutException

my_links = []
while True:
    try:
        current_length = len(my_links)
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        wait(driver, 10).until(lambda: len(driver.find_elements_by_xpath("//li[contains(concat(' ', @class, ' '), ' small-12 ')]//a")) > current_length)
        my_links.extend([a.get_attribute("href") for a in driver.find_elements_by_xpath("//li[contains(concat(' ', @class, ' '), ' small-12 ')]//a")])
    except TimeoutException:
        break

my_links = set(my_links)

这应该允许您在可能的情况下向下滚动并收集新链接。最后,使用 set() 您只能保留唯一值