পাইথনে সেলেনিয়াম ওয়েবড্রাইভার ব্যবহার করে আমি কীভাবে একটি ওয়েব পৃষ্ঠা স্ক্রোল করতে পারি?


130

আমি বর্তমানে ফেসবুক ব্যবহারকারী বন্ধু পৃষ্ঠাগুলি পার্স করতে এবং এজেএক্স স্ক্রিপ্ট থেকে সমস্ত আইডি বের করতে সেলেনিয়াম ওয়েবড্রাইভার ব্যবহার করছি। তবে সমস্ত বন্ধু পেতে আমার নীচে স্ক্রোল করা দরকার। আমি কীভাবে সেলেনিয়ামে স্ক্রোল করতে পারি। আমি পাইথন ব্যবহার করছি।



ড্রাইভার.execute_script (f "window.scrolTo (0, {2 ** 127});")
আতুরসামস

উত্তর:


262

তুমি ব্যবহার করতে পার

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

যেখানে Y উচ্চতা (ফুলহাইড মনিটরে এটি 1080)। (@ লুকাইসকে ধন্যবাদ)

আপনি ব্যবহার করতে পারেন

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

পৃষ্ঠার নীচে স্ক্রোল করতে

আপনি যদি অসীম লোড সহ কোনও পৃষ্ঠাতে স্ক্রোল করতে চান তবে সোশ্যাল নেটওয়ার্কগুলি, ফেসবুক ইত্যাদি (@ কুং ট্রানকে ধন্যবাদ)

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কি কিছুটা ব্যাখ্যা করতে পারেন , এর অর্থ কী এবং এটি সাধারণভাবে কীভাবে কাজ করে?
জেসন গোল

তারপরে আপনি কীভাবে "শেষের উচ্চতা" পরিবর্তনশীলটি ব্যবহার করবেন? আমার কোডে আমার অনুরূপ কিছু রয়েছে এবং ব্রাউজারটি নীচে স্ক্রল করছে। যাইহোক, আমি যখন ডেটাটি স্ক্র্যাপ করে দেখি তখন এটি প্রথম পৃষ্ঠার কে বারের তথ্যগুলিকে কেবল "কে" দিয়ে স্ক্র্যাপ করে ব্রাউজারের স্ক্রোল ডাউন হওয়ার সংখ্যা।
পিটার লেনার্স

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


এটা অসাধারণ. ইনস্টাগ্রামে যে কেউ এটি ব্যবহার করার চেষ্টা করছেন, তার জন্য আপনাকে প্রথমে অ্যাকশনচেইনগুলি ব্যবহার করে "আরও লোড করুন" বোতামে ট্যাব লাগাতে হবে, তারপরে কিউং ট্রানের সমাধানটি প্রয়োগ করুন ... কমপক্ষে এটি আমার পক্ষে কাজ করেছে।
Mwspencer

উত্তর করার জন্য ধন্যবাদ! আমি যা করতে চাই তা হ'ল ইনস্টলগ্রামে পৃষ্ঠার নীচের অংশে উদাহরণস্বরূপ স্ক্রোল করুন, তারপরে পৃষ্ঠার পুরো এইচটিএমএলটি ধরুন। সেলেনিয়ামে এমন কোনও ফাংশন আছে যেখানে আমি নীচে স্ক্রোল করার পরে আমি শেষের উচ্চতা ইনপুট হিসাবে দিতে এবং পুরো পৃষ্ঠাটি এইচটিএমএল পেতে পারি?
সোয়ান 87

2
SCROLL_PAUSE_TIMEপরিবর্তিত হয়, এটা আমার জন্য 2 সেকেন্ডের প্রায় সময় লাগে।
ssi-anik

30

আপনি send_keysএকটি END(বা PAGE_DOWN) কী টিপস (যা সাধারণত পৃষ্ঠাটি স্ক্রোল করে ) সিমুলেট করতে ব্যবহার করতে পারেন :

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

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

এটি যখন আমি এমন কোনও 'লি' অ্যাক্সেস করার চেষ্টা করছিলাম যা দৃশ্যমান নয় helped


'find_element_by_xpath' একটি ড্রাইভার ফাংশন বা কী, '.Location_once_scrolled_into_view' ত্রুটি প্রদান করে NoSuchElementException: বার্তা: এই জাতীয় কোনও উপাদান: উপাদান সনাক্ত করতে অক্ষম: {"পদ্ধতি": "এক্সপথ", "নির্বাচক": "// * [@ আইডি = "টাইমলাইন-মেডলে"] /
ডিভ

শুধু আর একটা জিনিস. কারণ location_once_scrolled_into_viewছাড়া বলা উচিত () যে location_once_scrolled_into_viewএকটি পাইথন property। উত্স কোডটি এখানে দেখুন: সেলেনিয়াম / ওয়েবেলেমেন্ট.পি d3b6ad006bd7dbee59f8539d81cee4f06bd81d64 · সেলেনিয়াম এইচকিউ / সেলেনিয়াম
ডেটাএলচিমিস্ট

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

যখন YouTube সঙ্গে কাজ ভাসমান উপাদান স্ক্রল উচ্চতা যেমন মান "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

আমি একটি ডায়নামিক ওয়েবপৃষ্ঠায় স্ক্রোল করার একটি উপায় খুঁজছিলাম এবং পৃষ্ঠার শেষ হওয়ার পরে স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায় এবং এই থ্রেডটি খুঁজে পেয়েছি।

@ কুং ট্রান এর পোস্ট , একটি প্রধান পরিবর্তন সহ আমি যে উত্তরটি খুঁজছিলাম was আমি ভেবেছিলাম যে অন্যরাও এই পরিবর্তনটি সহায়ক হিসাবে খুঁজে পেতে পারে (কোডটি কীভাবে কাজ করে তার একটি স্পষ্ট প্রভাব রয়েছে), সুতরাং এই পোস্টটি।

পরিবর্তনটি হ'ল বিবৃতিটি সরানো হয় যা লুপের অভ্যন্তরে শেষ পৃষ্ঠার উচ্চতা ক্যাপচার করে (যাতে প্রতিটি চেক আগের পৃষ্ঠার উচ্চতার সাথে তুলনা করে)।

সুতরাং, নীচের কোড:

অবিচ্ছিন্নভাবে একটি গতিশীল ওয়েবপৃষ্ঠা স্ক্রোল করে ( .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
ড্রাইভার.উইউটি () ব্লকের বাইরে থাকা উচিত নাকি? এবং শেষ অন্তর্নিহিত অপেক্ষার প্রয়োজন হয় না .. কেউ দয়া করে নিশ্চিত হন। @ashishmishra
ihightower

1

আপনি যদি কোনও নির্দিষ্ট ভিউ / ফ্রেমের (ওয়েবএলিমেন্ট) মধ্যে স্ক্রোল করতে চান তবে আপনাকে কেবল যা করতে হবে তা হল "বডি" একটি নির্দিষ্ট উপাদান দিয়ে প্রতিস্থাপন করা যা আপনি ভিতরে স্ক্রোল করতে চান। আমি নীচের উদাহরণে "getElementById" এর মাধ্যমে সেই উপাদানটি পেয়েছি:

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

উদাহরণস্বরূপ, এটি ইউটিউবে ঘটনাটি ...


1

ScrollTo()ফাংশন আর কাজ করে না। এটিই আমি ব্যবহার করেছি এবং এটি ভাল কাজ করেছে।

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

কেবলমাত্র এই পদ্ধতিটি আমার ক্ষেত্রে কাজ করেছিল, অন্যান্য কাজ করে না। ধন্যবাদ।
ইপন্ডিত

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

এটা আমার ক্ষেত্রে কাজ করছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.