0

pythonをセレニウムと組み合わせてスクリプトを書いて、すべてのリンクを表示しないWebページからすべての会社リンクをスクロールダウンさせます。しかし、私がスクリプトを実行すると、私は望みのリンクを得ることができますが、重複しているものがたくさんあります。この時点で、私はどのようにスクリプトを修正してユニークなリンクを得ることができるのか分かりません。ここで私はこれまで試したものです:私のスクリプトは無限のスクロールウェブページから何度も何度もリンクを解析します

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を知らないが、私はあなたが間違って何をしているか知っています。

リンクをスクロールするたびに、リンクが1000個になるまでページに50個のリンクが追加されます。まあ、ほとんど...それは20本のリンクで始まり、その後、あなたのコードは、今あなたが印刷されている1000

方法があるまで、毎回30を追加し、50:

第一20件のリンクが。

第一20は、再び次の30

を+ 1 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

あなたの完璧で堅牢なソリューションのおかげでGeorge McConnonありがとうございます。私はそれが欲しかったように機能します。 – 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

ああ、うん。 'lambda driver:'の代わりに 'lambda:'を試してみてください – Andersson

+0

'selenium.webdriver.common.keys import Keys'からインポートを行い、' driver.execute_script( "window.scrollTo(0、document.body) .scrollHeight); ")' 'driver.find_element_by_tag_name(" body ")。send_keys(Keys.END)'で? – Andersson

関連する問題