我已经使用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()
答案 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()
,您只能保留唯一值