Làm cách nào tôi có thể cuộn một trang web bằng cách sử dụng selenium webdo trong python?


130

Tôi hiện đang sử dụng weben selen để phân tích thông qua trang bạn bè của người dùng facebook và trích xuất tất cả các id từ tập lệnh AJAX. Nhưng tôi cần phải cuộn xuống để có được tất cả bạn bè. Làm thế nào tôi có thể cuộn xuống trong Selenium. Tôi đang sử dụng trăn.


2
bản sao có thể có của Cách cuộn trang bằng selenium
Louis

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

Câu trả lời:


262

Bạn có thể dùng

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

Trong đó Y là chiều cao (trên màn hình fullhd là 1080). (Cảm ơn @lukeis)

Bạn cũng có thể dùng

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

để cuộn xuống cuối trang.

Nếu bạn muốn cuộn đến một trang có tải vô hạn , như mạng xã hội, facebook, v.v. (cảm ơn @Cuong Tran)

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

một phương pháp khác (nhờ Juanse) là, chọn một đối tượng và

label.sendKeys(Keys.PAGE_DOWN);

1
Tuyệt vời, bạn có thể giải thích một chút về scrollHeightnó, nó có nghĩa là gì và nó hoạt động như thế nào nói chung?
Jason Goal

Làm thế nào bạn sẽ sử dụng biến "last_height"? Tôi có một cái gì đó tương tự trong mã của tôi và trình duyệt đang cuộn xuống. Tuy nhiên, khi tôi nhìn vào dữ liệu, tôi chỉ quét dữ liệu từ trang đầu tiên k lần với "k" là số lần trình duyệt cuộn xuống.
Peter Lenaers

72

Nếu bạn muốn cuộn xuống cuối trang vô hạn (như Linkedin.com ), bạn có thể sử dụng mã này:

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

Tham khảo: https://stackoverflow.com/a/28928684/1316860


Điều đó thật tuyệt. Đối với bất kỳ ai đang cố gắng sử dụng tính năng này trên instagram, bạn có thể cần tab đầu tiên vào nút "Tải thêm" bằng ActionChains, sau đó áp dụng giải pháp của Cường Trần ... ít nhất đó là những gì hiệu quả với tôi.
Mwspencer

Cảm ơn câu trả lời! Những gì tôi muốn làm là cuộn ví dụ trong instagram xuống cuối trang, sau đó lấy toàn bộ html của trang. Có một chức năng trong selenium nơi tôi có thể cung cấp last_height làm đầu vào và lấy toàn bộ trang html, sau khi tôi đã cuộn xuống dưới cùng?
Swan87

2
Sự SCROLL_PAUSE_TIMEkhác biệt, tôi mất khoảng 2 giây.
ssi-anik


21

phương pháp tương tự như được hiển thị ở đây :

trong python bạn chỉ có thể sử dụng

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

(Y là vị trí thẳng đứng bạn muốn cuộn đến)


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

element.location_once_scrolled_into_view

điều này có ích khi tôi đang cố truy cập vào một 'li' không thể nhìn thấy.


'find_element_by_xpath' là một hàm trình điều khiển hoặc cái gì, '.location_once_scrolled_into_view' trả về lỗi NoSuchEuityException: Message: no such such = "timeline-medley"] / div / div [2] / div [1] "}
Walid Bousseta

Chỉ một điều nữa. Lý do tại sao location_once_scrolled_into_viewnên được gọi mà không () có đó location_once_scrolled_into_viewlà Python property. xem mã nguồn tại đây: selenium / webelement.py tại d3b6ad006bd7dbee59f8539d81cee4f06bd81d64 · SeleniumHQ / selenium
DataAlchemist

10

Với mục đích của tôi, tôi muốn cuộn xuống nhiều hơn, giữ cho vị trí cửa sổ trong tâm trí. Giải pháp của tôi là tương tự và được sử dụngwindow.scrollY

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

sẽ đi đến vị trí cuộn y hiện tại + 200


8

Đây là cách bạn cuộn xuống trang web:

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

7

Cách dễ nhất tôi tìm thấy để giải quyết vấn đề đó là chọn nhãn rồi gửi:

label.sendKeys(Keys.PAGE_DOWN);

Hy vọng nó hoạt động!


6

Không có câu trả lời nào trong số này làm việc cho tôi, ít nhất là không phải để cuộn xuống trang kết quả tìm kiếm trên facebook, nhưng tôi đã tìm thấy sau rất nhiều thử nghiệm giải pháp này:

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

Nó hoạt động, nhưng rất chậm (ít nhất là đối với tôi). Tôi thấy rằng nếu bạn đặt SCROLL_PAUSE_TIMEtrong stackoverflow.com/a/27760083/7326714 thành 2, nó hoạt động tốt và bạn cuộn xuống nhanh hơn 100 lần.
LucSpan

6

Khi làm việc với youtube, các phần tử nổi cho giá trị "0" là chiều cao cuộn thay vì sử dụng "return document.body.scrollHeight" hãy thử sử dụng cái này "return document.documentEuity.scrollHeight" điều chỉnh thời gian tạm dừng cuộn theo internet của bạn tốc độ khác nó sẽ chạy chỉ một lần và sau đó nghỉ sau đó.

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

Tôi đang tìm cách cuộn qua một trang web động và tự động dừng lại khi đến cuối trang và tìm thấy chủ đề này.

Bài đăng của @Cuong Tran , với một sửa đổi chính, là câu trả lời mà tôi đang tìm kiếm. Tôi nghĩ rằng những người khác có thể thấy sửa đổi hữu ích (nó có ảnh hưởng rõ rệt đến cách mã hoạt động), do đó bài đăng này.

Việc sửa đổi là để di chuyển câu lệnh chụp chiều cao trang cuối cùng bên trong vòng lặp (sao cho mỗi lần kiểm tra được so sánh với chiều cao trang trước đó).

Vì vậy, mã dưới đây:

Liên tục cuộn xuống một trang web động ( .scrollTo()), chỉ dừng lại khi, trong một lần lặp, chiều cao trang vẫn giữ nguyên.

(Có một sửa đổi khác, trong đó câu lệnh break nằm trong một điều kiện khác (trong trường hợp trang 'gậy') có thể được gỡ bỏ).

    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

Mã này cuộn xuống phía dưới nhưng không yêu cầu bạn phải đợi mỗi lần. Nó sẽ liên tục cuộn, và sau đó dừng ở dưới cùng (hoặc hết thời gian)

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

Điều này nhanh hơn nhiều so với việc chờ 0,5-3 giây mỗi lần cho một phản hồi, khi phản hồi đó có thể mất 0,1 giây


3

cuộn trang tải. Ví dụ: trung bình, quora, vv

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.quito () có nên ở ngoài khối while hay không? và cũng là sự chờ đợi ngầm cuối cùng là không bắt buộc .. ai đó vui lòng xác nhận. @ashishmishra
ihightower

1

nếu bạn muốn cuộn trong một khung nhìn / khung cụ thể (WebE bổ sung), điều bạn chỉ cần làm là thay thế "cơ thể" bằng một yếu tố cụ thể mà bạn định cuộn trong đó. tôi lấy phần tử đó thông qua "getEuityById" trong ví dụ dưới đây:

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

đây là trường hợp trên YouTube , ví dụ ...


1

Các ScrollTo()chức năng không hoạt động nữa. Đây là những gì tôi đã sử dụng và nó hoạt động tốt.

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

Chỉ có phương pháp này làm việc trong trường hợp của tôi, không làm việc khác. Cảm ơn.
ePandit

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

nó làm việc cho trường hợp của tôi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.