我的脚本从无限滚动网页

时间:2017-07-03 21:29:34

标签: python-3.x selenium selenium-webdriver web-scraping lazy-loading

我已经使用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()

2 个答案:

答案 0 :(得分:1)

我不知道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)”

答案 1 :(得分:1)

您可以尝试以下代码:

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(),您只能保留唯一值