0

我已经写了使用硒组合蟒蛇摆脱它不显示,直到滚动最下面的所有链接网页上的所有公司链接脚本的所有链接。但是,当我运行我的脚本时,我会得到期望的链接,但是有很多重复的内容正在被抓取。在这一点上,我不明白我怎样才能修改我的脚本来获得独特的链接。这是我迄今为止所尝试的:我的剧本一再解析从无限滚动网页

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() 

回答

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)”对于安德森的等待语句

+0

感谢乔治·麦康,为您完美的和可靠的解决方案。它按我想要的那样工作。 – SIM

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()你可以只留下唯一值

+0

谢谢安德森先生,感谢您的回复。我有一个小问题试图你的代码。我得到这个错误:“()需要0个位置参数,但给出了1个”。 – SIM

+1

哦,是的。尝试'拉姆达司机:',而不仅仅是'拉姆达:' – Andersson

+0

你可以尝试让从selenium.webdriver.common.keys进口'导入Keys'和替换'driver.execute_script(“window.scrollTo(0,document.body的.scrollHeight); “)''与driver.find_element_by_tag_name(” 正文“)send_keys(Keys.END)'? – Andersson