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