Làm cách nào để cuộn trang web bằng trình duyệt web selenium trong python?

146
user2523364 2014-01-08 17:44.

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

18 answers

288
OWADVL 2015-01-04 12:13.

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ó lượng 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);
78
Cuong Tran 2017-04-09 09:32.

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

37
LIU YUE 2018-07-15 19:34.

Bạn có thể sử dụng send_keysđể mô phỏng một phím bấm ( ENDhoặc PAGE_DOWN) (thao tác này thường cuộn trang):

from selenium.webdriver.common.keys import Keys
html = driver.find_element_by_tag_name('html')
html.send_keys(Keys.END)
24
lukeis 2014-01-08 18:04.

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)

16
premonition 2016-06-08 12:54.
element=find_element_by_xpath("xpath of the li you are trying to access")

element.location_once_scrolled_into_view

điều này đã giúp ích khi tôi cố gắng truy cập vào một 'li' không hiển thị.

10
Nick Brady 2018-08-03 06:59.

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

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

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

8
sahaja nadendla 2018-11-28 21:14.

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

driver.execute_script("window.scrollTo(0, 1000);")
7
Bass Dee 2017-11-10 02:37.

Không có câu trả lời nào trong số này phù hợp với tôi, ít nhất là không phải khi 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 lần 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
7
Juanse 2018-04-17 08:21.

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

label.sendKeys(Keys.PAGE_DOWN);

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

6
Vinay Verma 2019-03-13 18:35.

Khi làm việc với youtube, các phần tử nổi cung cấp giá trị "0" làm chiều cao cuộn, vì vậy thay vì sử dụng "return document.body.scrollHeight", hãy thử sử dụng "return document.documentElement.scrollHeight" này để đ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ỉ chạy một thời gian và sau đó ngắt 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
Splarty 2018-09-04 08:21.

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 chuỗi này.

Bài 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 nắm bắt chiều cao trang cuối cùng bên trong vòng lặp (để mỗi lần kiểm tra được so sánh với chiều cao trang trước đó).

Vì vậy, đoạn 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 'dính') có thể bị xóa).

    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
Osuynonma 2019-07-11 15:20.

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

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 đợi 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

5
ashishmishra 2019-04-23 02:54.

cuộn trang tải. Ví dụ: phương tiện, quora, v.v.

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()
2
MoKG 2020-03-19 00:09.

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();")
1
Noname 2020-01-14 00:01.

nếu bạn muốn cuộn trong một khung nhìn / khung cụ thể (WebElement), những gì bạn chỉ cần làm là thay thế "body" bằng một phần tử cụ thể mà bạn định cuộn bên trong. tôi lấy phần tử đó qua "getElementById" trong ví dụ bên dưới:

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

ví dụ như trường hợp này trên YouTube ...

1
coder420 2020-08-08 01:56.

Đây là một đoạn mã selen mẫu mà bạn có thể sử dụng cho loại mục đích này. Nó đi đến url cho kết quả tìm kiếm trên youtube về 'Liệt kê hướng dẫn python' và cuộn xuống cho đến khi tìm thấy video có tiêu đề: 'Liệt kê hướng dẫn python (2020).'

driver.get('https://www.youtube.com/results?search_query=enumerate+python')
target = driver.find_element_by_link_text('Enumerate python tutorial(2020).')
target.location_once_scrolled_into_view
0
Long Lê Hoàng 2020-06-12 03:44.
driver.execute_script("document.getElementById('your ID Element').scrollIntoView();")

nó hoạt động cho trường hợp của tôi.

0
THE PROGRAMMER NOUR-ELDIN1 2020-09-09 04:19.

Bạn có thể sử dụng send_keys để mô phỏng thao tác nhấn phím PAGE_DOWN (thao tác này thường cuộn trang):

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

Related questions

MORE COOL STUFF

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett đã bất chấp những lời khuyên hẹn hò điển hình khi cô gặp chồng mình.

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Michael Sheen là một diễn viên phi lợi nhuận nhưng chính xác thì điều đó có nghĩa là gì?

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Ngôi sao của Hallmark Colin Egglesfield chia sẻ về những cuộc gặp gỡ với người hâm mộ ly kỳ tại RomaDrama Live! cộng với chương trình INSPIRE của anh ấy tại đại hội.

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Bạn sẽ phải phủi sạch đầu đĩa Blu-ray hoặc DVD để xem tại sao Northern Exposure trở thành một trong những chương trình nổi tiếng nhất của thập niên 90.

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

8 công dụng tuyệt vời của Baking Soda và Giấm

8 công dụng tuyệt vời của Baking Soda và Giấm

Bạn biết đấy, hai sản phẩm này là nguồn điện để làm sạch, riêng chúng. Nhưng cùng với nhau, chúng có một loạt công dụng hoàn toàn khác.

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Thủy điện rất cần thiết cho lưới điện của Hoa Kỳ, nhưng nó chỉ tạo ra năng lượng khi có nước di chuyển. Bao nhiêu nhà máy thủy điện có thể gặp nguy hiểm khi các hồ và sông cạn kiệt?

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Tóc tỉa từ các tiệm và các khoản quyên góp cá nhân có thể được tái sử dụng như những tấm thảm thấm dầu và giúp bảo vệ môi trường.

Làm thế nào để xây dựng một quả địa cầu từ Scratch

Làm thế nào để xây dựng một quả địa cầu từ Scratch

Thời gian, sự kiên nhẫn, thời gian, sự cống hiến và thời gian chỉ là một vài trong số những thứ mà Peter Bellerby cần để thành lập và sau đó điều hành Bellerby & Co. Globemakers, một trong những công ty duy nhất trên Trái đất vẫn sản xuất các quả địa cầu bằng tay.

Năm giai đoạn đau buồn sau khi mất việc làm

Năm giai đoạn đau buồn sau khi mất việc làm

Đó là một ngày thứ Bảy, máy bay của tôi hạ cánh, và tôi đã sẵn sàng để thư giãn trong một kỳ nghỉ cuối tuần ngắn ngủi, khi một email đến trên điện thoại của tôi. Tôi đã mất việc.

Giữ an toàn cho danh tính của bạn với một cảnh báo đóng băng hoặc gian lận tín dụng

Giữ an toàn cho danh tính của bạn với một cảnh báo đóng băng hoặc gian lận tín dụng

Nếu bạn đã từng bị đánh cắp danh tính của mình, bạn biết đó là một trải nghiệm đáng sợ và căng thẳng. Một cách không phổ biến để ngăn chặn nó? Tín dụng bị đóng băng.

Buổi ra mắt phần 3 của The Good Place có một học sinh mới: Khán giả

Buổi ra mắt phần 3 của The Good Place có một học sinh mới: Khán giả

Eleanor (Kristen Bell) dường như đã tình nguyện cho chúng tôi làm vật tưởng nhớ. NBC's The Good Place là một chương trình thích thử thách tốt.

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa. Từ Hollywood đến New York và mọi nơi ở giữa, hãy xem các ngôi sao yêu thích của bạn đang làm gì!

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

Các nhà điều tra đang xem xét liệu nhóm và nghi phạm có biết nhau trước vụ tấn công hay không

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Vụ kiện, nêu tên một số học khu, lập luận rằng dự luật "Không nói đồng tính" được ban hành gần đây của Florida "có hiệu quả im lặng và xóa bỏ học sinh và gia đình LGBTQ +"

Đường băng hạ cánh

Đường băng hạ cánh

Cuối hè đầu thu là mùa hoài niệm. Những chiếc đèn đường chiếu ánh sáng của chúng qua những con đường đẫm mưa, và những chiếc lá dưới chân - màu đỏ cam tắt trong bóng chạng vạng - là lời nhắc nhở về những ngày đã qua.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Vào năm 2021, tôi khuyến khích bạn suy nghĩ lại mọi thứ bạn biết về khách hàng mà bạn phục vụ và những câu chuyện bạn kể cho họ. Lùi lại.

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Vào ngày sinh nhật thứ 9 của Felix The Cat, tôi nhớ về một trong những mất mát lớn nhất trong cuộc đời trưởng thành của tôi - Sophie của tôi vào năm 2013. Tôi đã viết bài luận này và chia sẻ nó trên nền tảng này một thời gian ngắn vào năm 2013.

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Tôi ghét từ "tàu đắm". Mọi người cảm thấy thoải mái trong la bàn đạo đức của riêng mình, và khi làm như vậy, họ thấy mình vượt qua sự phán xét.

Language