मैं अजगर में सेलेनियम वेबड्राइवर का उपयोग करके वेब पेज को कैसे स्क्रॉल कर सकता हूं?


132

मैं वर्तमान में फेसबुक उपयोगकर्ता मित्र पृष्ठ के माध्यम से पार्स करने और AJAX स्क्रिप्ट से सभी आईडी निकालने के लिए सेलेनियम वेबड्राइवर का उपयोग कर रहा हूं। लेकिन मुझे सभी मित्रों को प्राप्त करने के लिए नीचे स्क्रॉल करने की आवश्यकता है। मैं सेलेनियम में कैसे स्क्रॉल कर सकता हूं। मैं अजगर का उपयोग कर रहा हूं।



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

जवाबों:


264

आप उपयोग कर सकते हैं

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

जहां Y ऊंचाई है (फुलएचडी मॉनिटर पर यह 1080 है)। (@Lukeis को धन्यवाद)

आप भी उपयोग कर सकते हैं

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

पृष्ठ के नीचे स्क्रॉल करने के लिए।

यदि आप किसी पेज को अनंत लोड करने के साथ स्क्रॉल करना चाहते हैं , जैसे सोशल नेटवर्क वाले, फेसबुक आदि (@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

एक अन्य विधि (जुआनस के लिए धन्यवाद) है, एक वस्तु का चयन करें और

label.sendKeys(Keys.PAGE_DOWN);

1
बहुत बढ़िया, क्या आप थोड़ा सा समझा सकते हैं scrollHeight, इसका क्या मतलब है और यह सामान्य रूप से कैसे काम करता है?
जेसन गोल

फिर आप "last_height" चर का उपयोग कैसे करेंगे? मेरे कोड में कुछ समान है और ब्राउज़र नीचे स्क्रॉल कर रहा है। हालाँकि, जब मैं डेटा को देख रहा हूँ तो मैं इसे केवल पहले पृष्ठ k से डेटा को "k" कर रहा हूँ जब ब्राउज़र स्क्रॉल होने की संख्या कम हो जाती है।
पीटर लेनर्स

72

यदि आप अनंत पृष्ठ के नीचे स्क्रॉल करना चाहते हैं (जैसे लिंक्डइन.कॉम ), तो आप इस कोड का उपयोग कर सकते हैं:

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

संदर्भ: https://stackoverflow.com/a/28928684/1316860


यह भी खूब रही। जो कोई भी इसे इंस्टाग्राम पर इस्तेमाल करने की कोशिश कर रहा है, उसके लिए आपको पहले एक्शनचिन्स का उपयोग करके "अधिक लोड करें" बटन पर टैब करना होगा, फिर क्यूओंग ट्रान के समाधान को लागू करें ... कम से कम मेरे लिए यह काम किया है।
21

जवाब के लिए धन्यवाद! मैं क्या करना चाहूंगा इंस्टाग्राम में पेज के निचले भाग में उदाहरण के लिए स्क्रॉल कर रहा हूं, फिर पेज के पूरे HTML को पकड़ो। क्या सेलेनियम में कोई फ़ंक्शन है जहाँ मैं इनपुट के रूप में last_height दे सकता हूं और नीचे तक स्क्रॉल करने के बाद पूरे पृष्ठ html प्राप्त कर सकता हूं?
स्वान87

2
SCROLL_PAUSE_TIMEभिन्न होता है, यह मेरे लिए 2 सेकंड के आसपास लेता है।
ssi-aik


21

यहाँ दिखाया गया है :

अजगर में आप सिर्फ उपयोग कर सकते हैं

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

(Y वह ऊर्ध्वाधर स्थिति है जिसे आप स्क्रॉल करना चाहते हैं)


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

element.location_once_scrolled_into_view

यह तब मदद की जब मैं एक 'ली' को एक्सेस करने की कोशिश कर रहा था जो दिखाई नहीं दे रहा था।


'find_element_by_xpath' एक ड्राइवर फ़ंक्शन या क्या है, '.location_once_scrolled_into_view' त्रुटि NoSuchElementException: संदेश: ऐसा कोई तत्व नहीं है: तत्व का पता लगाने में असमर्थ: {"पद्धति": "xpath", "selector": "// * @ id = "टाइमलाइन-मेडले"] / डिव / डिव [2] / डिव [1] "}
वालिद बोसेट्टा

सिर्फ एक और बात। location_once_scrolled_into_viewबिना बुलाए जाने का कारण यह () है कि location_once_scrolled_into_viewपायथन है property। यहां स्रोत कोड देखें: d3b6ad006bd7dbee59f8539d81cee4f06bd81d64 में सेलेनियम / webelement.py · SeleniumHQ / सेलेनियम
DataAlchemist

10

अपने उद्देश्य के लिए, मैं खिड़कियों की स्थिति को ध्यान में रखते हुए और अधिक स्क्रॉल करना चाहता था। मेरा समाधान भी ऐसा ही था और इसका इस्तेमाल किया गया थाwindow.scrollY

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

जो वर्तमान y स्क्रॉल स्थिति + 200 पर जाएगा



7

उस समस्या को हल करने का सबसे आसान तरीका मुझे एक लेबल का चयन करना और फिर भेजना था:

label.sendKeys(Keys.PAGE_DOWN);

मुझे भरोसा है ये काम करेगा!


6

इनमें से किसी भी उत्तर ने मेरे लिए काम नहीं किया, कम से कम फेसबुक खोज परिणाम पृष्ठ को नीचे स्क्रॉल करने के लिए नहीं, लेकिन मुझे इस समाधान के परीक्षण के बाद बहुत कुछ मिला:

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

यह काम करता है, लेकिन बहुत धीमा (मेरे लिए कम से कम)। मैंने पाया है कि अगर आप सेट SCROLL_PAUSE_TIMEमें stackoverflow.com/a/27760083/7326714 लिए 2, यह सिर्फ ठीक काम करता है और आप एक 100x तेजी से नीचे स्क्रॉल करें।
ल्यूकस्पैन

6

जब यूट्यूब के साथ काम चल तत्वों स्क्रॉल ऊंचाई के रूप में मूल्य "0" दे तो बजाय का उपयोग करने से "वापस document.body.scrollHeight" इस एक का उपयोग करके देखें "वापस document.documentElement.scrollHeight" अपने इंटरनेट के अनुसार पुस्तक ठहराव समय समायोजित गति यह केवल एक समय के लिए चलेगी और उसके बाद टूट जाएगी।

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

मैं एक गतिशील वेबपेज के माध्यम से स्क्रॉल करने का एक तरीका तलाश रहा था, और पेज के अंत तक पहुंचने के बाद स्वचालित रूप से रोक रहा था, और इस धागे को पाया।

@Cuong ट्रान द्वारा पोस्ट , एक मुख्य संशोधन के साथ, वह उत्तर था जिसकी मुझे तलाश थी। मैंने सोचा था कि अन्य लोग संशोधन को उपयोगी पा सकते हैं (इसका एक स्पष्ट प्रभाव है कि कोड कैसे काम करता है), इसलिए यह पोस्ट।

संशोधन बयान को स्थानांतरित करने के लिए है जो लूप के अंदर अंतिम पृष्ठ की ऊंचाई को कैप्चर करता है (ताकि प्रत्येक चेक पिछले पृष्ठ की ऊंचाई की तुलना कर रहा है)।

तो, नीचे दिया गया कोड:

लगातार गतिशील वेबपेज को स्क्रॉल करता है ( .scrollTo()), केवल जब एक पुनरावृत्ति के लिए रुकता है, तो पृष्ठ की ऊंचाई समान रहती है।

(एक और संशोधन है, जहां विराम कथन एक अन्य शर्त के अंदर है (पृष्ठ 'चिपक' के मामले में) जिसे हटाया जा सकता है)।

    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

यह कोड नीचे तक स्क्रॉल करता है लेकिन आपको हर बार प्रतीक्षा करने की आवश्यकता नहीं होती है। यह लगातार स्क्रॉल करेगा, और फिर नीचे (या टाइमआउट) पर रुक जाएगा

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

यह प्रतिक्रिया के लिए प्रत्येक बार 0.5-3 सेकंड की प्रतीक्षा करने की तुलना में बहुत तेज़ है, जब यह प्रतिक्रिया 0.1 सेकंड ले सकती है


3

लोडिंग पेज स्क्रॉल करें। उदाहरण: मध्यम, क्वोरा, आदि

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 () ब्लॉक करते समय होना चाहिए या नहीं? और भी अंतिम निहित प्रतीक्षा की आवश्यकता नहीं है .. किसी को pls की पुष्टि करें। @ आशीषमिश्र
ihightower

1

यदि आप किसी विशेष दृश्य / फ्रेम (वेबइमेंट) में स्क्रॉल करना चाहते हैं , तो आपको केवल एक विशेष तत्व के साथ "बॉडी" को बदलने की आवश्यकता है जिसे आप स्क्रॉल करना चाहते हैं। मुझे वह तत्व नीचे दिए गए उदाहरण में "getElementById" के माध्यम से मिलता है:

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

उदाहरण के लिए YouTube पर यह मामला है ...


1

ScrollTo()समारोह अब और काम नहीं करता। यह वही है जो मैंने इस्तेमाल किया और यह ठीक काम किया।

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

केवल इस विधि ने मेरे मामले में काम किया, अन्य काम नहीं किया। धन्यवाद।
ePandit

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.