Python'da selenium webdriver kullanarak bir web sayfasını nasıl kaydırabilirim?


132

Şu anda facebook kullanıcı arkadaşları sayfasını ayrıştırmak ve AJAX komut dosyasından tüm kimlikleri çıkarmak için selenium webdriver kullanıyorum. Ama bütün arkadaşlarımı toplamak için aşağı kaydırmam gerekiyor. Selenium'da nasıl aşağı kaydırabilirim. Python kullanıyorum.



driver.execute_script (f "window.scrollTo (0, {2 ** 127});")
AturSams

Yanıtlar:


264

Kullanabilirsiniz

driver.execute_script("window.scrollTo(0, Y)") 

Y yüksekliktir (fullhd monitörde 1080'dir). (@Lukeis'e teşekkürler)

Ayrıca kullanabilirsiniz

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

sayfanın altına gitmek için.

Sosyal ağlar, facebook vb. Gibi sonsuz yüklemeye sahip bir sayfaya geçmek istiyorsanız (@ Cuong Tran sayesinde)

SCROLL_PAUSE_TIME = 0.5

# Get scroll height
last_height = driver.execute_script("return document.body.scrollHeight")

while True:
    # Scroll down to bottom
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    # Wait to load page
    time.sleep(SCROLL_PAUSE_TIME)

    # Calculate new scroll height and compare with last scroll height
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height

(Juanse sayesinde) başka bir yöntem, bir nesne seçmek ve

label.sendKeys(Keys.PAGE_DOWN);

1
Harika, biraz açıklar mısınız scrollHeight, ne anlama geliyor ve genel olarak nasıl çalışıyor?
Jason Goal

O halde "last_height" değişkenini nasıl kullanırsınız? Kodumda benzer bir şey var ve tarayıcı aşağı doğru kayıyor. Ancak, kazıma yaptığım verilere baktığımda, yalnızca ilk sayfadaki verileri k kez kazıyor ve "k", tarayıcının aşağı kaydırma sayısıdır.
Peter Lenaers

72

Eğer istersen Sonsuz sayfanın en altına kaydırmak ( linkedin.com gibi ), şu kodu kullanabilirsiniz:

SCROLL_PAUSE_TIME = 0.5

# Get scroll height
last_height = driver.execute_script("return document.body.scrollHeight")

while True:
    # Scroll down to bottom
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    # Wait to load page
    time.sleep(SCROLL_PAUSE_TIME)

    # Calculate new scroll height and compare with last scroll height
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height

Referans: https://stackoverflow.com/a/28928684/1316860


Bu harika. Bunu instagram üzerinde kullanmaya çalışan herkes için önce ActionChains kullanarak "Daha fazla yükle" düğmesine gitmeniz, ardından Cuong Tran çözümünü uygulamanız gerekebilir ... en azından benim için işe yarayan buydu.
Mwspencer

Cevap için teşekkürler! Yapmak istediğim şey, örneğin instagramda sayfanın altına kaydırmak, ardından sayfanın tüm html'sini almak. Selenyumda girdi olarak last_height verebileceğim ve aşağıya kaydırdıktan sonra sayfanın html'sini alabileceğim bir işlev var mı?
Swan87

2
SCROLL_PAUSE_TIMEDeğişir, benim için 2 saniye sürer.
ssi-anik

30

send_keysBir END(veya PAGE_DOWN) tuşuna basmanın benzetimini yapmak için kullanabilirsiniz (normalde sayfayı kaydırır):

from selenium.webdriver.common.keys import Keys
html = driver.find_element_by_tag_name('html')
html.send_keys(Keys.END)

21

burada gösterilenle aynı yöntem :

python'da sadece kullanabilirsiniz

driver.execute_script("window.scrollTo(0, Y)")

(Y, kaydırmak istediğiniz dikey konumdur)


15
element=find_element_by_xpath("xpath of the li you are trying to access")

element.location_once_scrolled_into_view

bu, görünmeyen bir 'li'ye erişmeye çalışırken yardımcı oldu.


"find_element_by_xpath" bir sürücü işlevidir veya ".location_once_scrolled_into_view" NoSuchElementException hatası döndürür: Mesaj: böyle bir öğe yok: Öğe bulunamıyor: {"method": "xpath", "selector": "// * [@ id = "zaman çizelgesi karışık"] / div / div [2] / div [1] "}
Walid Bousseta

Sadece bir şey daha. location_once_scrolled_into_viewOlmadan çağrılmasının nedeni () , bu location_once_scrolled_into_viewbir Python'dur property. kaynak koduna buradan bakın: selenium / webelement.py, d3b6ad006bd7dbee59f8539d81cee4f06bd81d64 · SeleniumHQ / selenium
DataAlchemist

10

Amacım için, pencerelerin konumunu göz önünde bulundurarak daha fazla aşağı kaydırmak istedim. Benim çözümüm benzerdi ve kullanıldıwindow.scrollY

driver.execute_script("window.scrollTo(0, window.scrollY + 200)")

mevcut y kaydırma konumuna gidecek + 200


8

Web sayfasını şu şekilde aşağı kaydırırsınız:

driver.execute_script("window.scrollTo(0, 1000);")

7

Bu sorunu çözmenin en kolay yolu bir etiket seçip göndermekti:

label.sendKeys(Keys.PAGE_DOWN);

Umarım çalışır!


6

Bu yanıtların hiçbiri benim için işe yaramadı, en azından bir facebook arama sonucu sayfasını aşağı kaydırmak için değil, ancak bu çözümü birçok test ettikten sonra buldum:

while driver.find_element_by_tag_name('div'):
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    Divs=driver.find_element_by_tag_name('div').text
    if 'End of Results' in Divs:
        print 'end'
        break
    else:
        continue

Çalışıyor, ancak çok yavaş (en azından benim için). Stackoverflow.com/a/27760083/7326714 olarak ayarlarsanız SCROLL_PAUSE_TIME, gayet iyi çalıştığını ve 100 kat daha hızlı aşağı kaydırdığınızı buldum . 2
LucSpan

6

YouTube ile çalışırken, kayan öğeler kaydırma yüksekliği olarak "0" değerini verir, bu nedenle "return document.body.scrollHeight" yerine bunu kullanmayı deneyin "return document.documentElement.scrollHeight" kaydırma duraklatma süresini internetinize göre ayarlayın Aksi takdirde, yalnızca bir kez çalışacak ve bundan sonra kesilecektir.

SCROLL_PAUSE_TIME = 1

# Get scroll height
"""last_height = driver.execute_script("return document.body.scrollHeight")

this dowsnt work due to floating web elements on youtube
"""

last_height = driver.execute_script("return document.documentElement.scrollHeight")
while True:
    # Scroll down to bottom
    driver.execute_script("window.scrollTo(0,document.documentElement.scrollHeight);")

    # Wait to load page
    time.sleep(SCROLL_PAUSE_TIME)

    # Calculate new scroll height and compare with last scroll height
    new_height = driver.execute_script("return document.documentElement.scrollHeight")
    if new_height == last_height:
       print("break")
       break
    last_height = new_height

5

Dinamik bir web sayfasında gezinmenin ve sayfanın sonuna ulaşıldığında otomatik olarak durmanın bir yolunu arıyordum ve bu konuyu buldum.

Gönderen @Cuong Tran , bir ana değişiklikle, ben arıyordum o cevap oldu. Başkalarının değişikliği yararlı bulabileceğini düşündüm (kodun nasıl çalıştığı üzerinde belirgin bir etkisi var), dolayısıyla bu yazı.

Değişiklik, döngü içindeki son sayfa yüksekliğini yakalayan ifadeyi taşımaktır (böylece her kontrol önceki sayfa yüksekliğiyle karşılaştırılır).

Yani, aşağıdaki kod:

Dinamik bir web sayfasını ( .scrollTo()) sürekli olarak aşağı kaydırır , yalnızca bir yineleme için sayfa yüksekliği aynı kaldığında durur.

(Break ifadesinin kaldırılabilen başka bir koşulda (sayfanın 'yapışması' durumunda) olduğu başka bir değişiklik vardır.

    SCROLL_PAUSE_TIME = 0.5


    while True:

        # Get scroll height
        ### This is the difference. Moving this *inside* the loop
        ### means that it checks if scrollTo is still scrolling 
        last_height = driver.execute_script("return document.body.scrollHeight")

        # Scroll down to bottom
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

        # Wait to load page
        time.sleep(SCROLL_PAUSE_TIME)

        # Calculate new scroll height and compare with last scroll height
        new_height = driver.execute_script("return document.body.scrollHeight")
        if new_height == last_height:

            # try again (can be removed)
            driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

            # Wait to load page
            time.sleep(SCROLL_PAUSE_TIME)

            # Calculate new scroll height and compare with last scroll height
            new_height = driver.execute_script("return document.body.scrollHeight")

            # check if the page height has remained the same
            if new_height == last_height:
                # if so, you are done
                break
            # if not, move on to the next loop
            else:
                last_height = new_height
                continue

5

Bu kod en alta kayar ancak her seferinde beklemenizi gerektirmez. Sürekli olarak kayar ve ardından en altta durur (veya zaman aşımına uğrar)

from selenium import webdriver
import time

driver = webdriver.Chrome(executable_path='chromedriver.exe')
driver.get('https://example.com')

pre_scroll_height = driver.execute_script('return document.body.scrollHeight;')
run_time, max_run_time = 0, 1
while True:
    iteration_start = time.time()
    # Scroll webpage, the 100 allows for a more 'aggressive' scroll
    driver.execute_script('window.scrollTo(0, 100*document.body.scrollHeight);')

    post_scroll_height = driver.execute_script('return document.body.scrollHeight;')

    scrolled = post_scroll_height != pre_scroll_height
    timed_out = run_time >= max_run_time

    if scrolled:
        run_time = 0
        pre_scroll_height = post_scroll_height
    elif not scrolled and not timed_out:
        run_time += time.time() - iteration_start
    elif not scrolled and timed_out:
        break

# closing the driver is optional 
driver.close()

Bu, yanıtın 0.1 saniye sürebildiği bir yanıt için her seferinde 0,5-3 saniye beklemekten çok daha hızlıdır.


3

yükleme sayfalarını kaydırın. Örnek: orta, quora vb.

last_height = driver.execute_script("return document.body.scrollHeight")
    while True:
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight-1000);")
        # Wait to load the page.
        driver.implicitly_wait(30) # seconds
        new_height = driver.execute_script("return document.body.scrollHeight")
    
        if new_height == last_height:
            break
        last_height = new_height
        # sleep for 30s
        driver.implicitly_wait(30) # seconds
    driver.quit()

1
driver.quit () while bloğunun dışında olmalı mı, olmamalı mı? ve ayrıca son örtük bekleme gerekli değildir .. birisi pls onaylar. @ashishmishra
ihightower

1

belirli bir görünüm / çerçeve (WebElement) içinde kaydırmak istiyorsanız , yapmanız gereken tek şey "body" öğesini, içinde kaydırmayı düşündüğünüz belirli bir öğe ile değiştirmektir. Bu öğeyi aşağıdaki örnekte "getElementById" aracılığıyla alıyorum:

self.driver.execute_script('window.scrollTo(0, document.getElementById("page-manager").scrollHeight);')

YouTube'da durum bu, örneğin ...


1

ScrollTo()Fonksiyon artık çalışmaz. Kullandığım bu ve iyi çalıştı.

driver.execute_script("document.getElementById('mydiv').scrollIntoView();")

Benim durumumda sadece bu yöntem işe yaradı, diğerleri işe yaramadı. Teşekkürler.
ePandit

0
driver.execute_script("document.getElementById('your ID Element').scrollIntoView();")

benim davam için çalışıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.