2017-06-13 29 views
0

私はいくつかのニュース記事をpythonとphantomjsで読むことを試みています。 無限のスクロールを使用して作業しているウェブサイトは、スクロールするときに次の記事を動的に読み込みます。 HereはサンプルURLです。python selenium phantomjsエンドレススクロールは最初のページでしか動作しません。

もう1つの記事を読み込めるようにするには、以下のコードを使用して管理しましたが、もう1つだけです...誰もが無限に働かせるよう手助けできますか?または何が間違っているかのヒントは、改善することができますか? ありがとうございました!

from selenium import webdriver 
from bs4 import BeautifulSoup 
from time import sleep 
from selenium.webdriver.common.proxy import * 
from selenium import webdriver 
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities 

# Pretend to be chrome 
dcap = dict(DesiredCapabilities.PHANTOMJS) 
dcap["phantomjs.page.settings.userAgent"] = (
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/53 " 
    "(KHTML, like Gecko) Chrome/15.0.87" 
) 

driver = webdriver.PhantomJS(desired_capabilities=dcap) 
driver.set_window_size(1120, 550) 

## GET 
driver.get("https://www.bloomberg.com/news/features/2017-06-08/no-one-has-ever-made-a-corruption-machine-like-this-one") 

# print current scrollTop 
driver.execute_script('return document.body.scrollTop') 
# out: 0 

# print current scrollHeight 
driver.execute_script('return document.body.scrollHeight') 
# out: 18255 

# scroll to bottom 
driver.execute_script("window.scrollTo(0, 18255)") 

# print current scrollTop 
driver.execute_script('return document.body.scrollTop') 
# out: 17705 

# print current scrollHeight 
driver.execute_script('return document.body.scrollHeight') 
# out: 29050 
# It works! Great! 

# Scroll to bottom again 
driver.execute_script("window.scrollTo(0, 29050)") 

# print current scrollTop 
driver.execute_script('return document.body.scrollTop') 
# out: 28500 

# print current scrollHeight 
driver.execute_script('return document.body.scrollHeight') 
# out: 29050 
# It's still the same, no matter how hard I try, it cannot load more... 


# According to tolmachofof's suggestion below, I tried to scroll very slowly, still no luck. :< 
top = driver.execute_script('return document.body.scrollTop') 
height = driver.execute_script('return document.body.scrollHeight') 
for i in range(top, height, 100): 
    driver.execute_script("window.scrollTo(0," + str(i) + ")") 
    print(driver.execute_script('return document.body.scrollTop')) 
    sleep(0.2) 

答えて

0

このスクリプトを使用することができます。

SCROLL_TEMPLATE = """ 

     var scroll_interval = arguments[0]; 
     var scroll_time = arguments[1]; 
     var scroll_step = arguments[2] 

     function scroll() { 
      document.body.scrollTop += scroll_step; 
     } 

     var _scroll = setInterval(scroll, scroll_interval) 
     setTimeout(function() {clearInterval(_scroll)}, scroll_time)""" 

    def scroll_page(driver, scroll_interval=0.5, scroll_time=5000, scroll_step=50): 
     driver.execute_script(SCROLL_TEMPLATE, scroll_interval, scroll_time, scroll_step) 
     # Script will finish before scroll if you delete it 
     sleep((scroll_time/1000) + 0.3) 

注:scroll_intervalは、単一のスクロールの文の間のタイムアウトです。 Scroll_timeは総ページスクロール時間です。 Scroll_step - シングルスクロールステップ(px)

+0

私の質問を読んで、私はそれをスクロールすることができますが、なぜそれが最初のページでのみ機能するのか分かりません... – Student222

+0

スクロールは非常に高速です。私は一度同じ問題を抱えていた。このソリューションは、スクロールのスピードを落とすことで、無限に改ページするのに役立ちました。 – tolmachofof

+0

ゆっくりとスクロールしようとしました。まだ動作しません... – Student222

関連する問題