2016-10-06 13 views
0

私はPythonとWebdriverを使用して、ユーザーがページをスクロールダウン(遅延読み込み)するとコンテンツを動的に読み込むページからデータをスクラップします。私は合計30のデータ要素を持っていますが、最初にスクロールダウンすることなく15だけが表示されます。PythonでPhantomJSをスクロールしている間に遅延読み込み要素を見つける

# Get All Data Items 
all_data = self.driver.find_elements_by_css_selector('div[some-attribute="some-attribute-value"]') 

# Iterate Through Each Item, Get Value 
data_value_list = [] 
for d in all_data: 
    # Get Value for Each Data item 
    data_value = d.find_element_by_css_selector('div[class="target-class"]').get_attribute('target-attribute') 

    #Save Data Value to List 
    data_value_list.append(data_value) 

私はChromeDriverを使用して、上記のコードを実行すると:私は私の要素を見つけ、それぞれの要素がロードされるまで、ページの下部に複数回スクロールした後、次のようにそれらの値を取得しています

私の画面上にブラウザのウィンドウを残したまま、私はdata_value_listを設定するために30個のデータ値をすべて取得します。 ChromeDriverを使用して上記のコードを実行すると、ウィンドウが最小化され、私のリストdata_value_listには最初の15個のデータ値が入力されます。

PhantomJSを使用しているときに同じ問題が発生し、data_value_listをページ上の最初に表示されたデータ値のみに制限しています。

PhantomJSを使用している間、ブラウザーを最小限に抑えながら、理想的にはこれらのタイプの要素をロードすることはありますか?

注:アクションチェーンを使用して、計算された回数だけ次のアプローチ.send_keys(Keys.PAGE_DOWN).perform()を使用してスクロールしています。

答えて

0

私は全く同じ問題を抱えていました。私が見つけた解決策は、要素を下にスクロールさせるために、仮想ブラウザでjavascriptコードを実行することでした。

JavascriptコマンドをSeleniumに入力する前に、Firefoxでページを開き、要素を調べてスクロール可能なコンテンツを見つけることをおすすめします。要素はすべての動的行を包含する必要がありますが、ではなくにスクロールバーが含まれている必要があります。次に、javascriptで要素を選択した後、そのscrollTop属性をscrollHeight属性に設定して要素を下にスクロールできます。

次に、ブラウザでコンテンツのスクロールをテストする必要があります。要素を選択する最も簡単な方法は、要素にIDがある場合はIDで行いますが、他の方法でも動作します。 ID「scrollableContent」を持つ要素を選択して、それが一番下までスクロールするには、ブラウザのJavaScriptコンソールに次のコードを実行します。

もちろん
e = document.getElementById('scrollableContent'); e.scrollTop = e.scrollHeight; 

は、これが唯一の現在のトップへコンテンツをスクロールし、必要になります複数回スクロールする必要がある場合は、新しいコンテンツが読み込まれた後にこれを繰り返す必要があります。また、私は正確な要素を見つける方法を考え出す方法がありません。私にとってそれは試行錯誤です。

これは私が試したいくつかのコードです。しかし、私はそれが改善できると感じており、コードをテストしたり、予測できないように傷つけるようなアプリケーションに適しているはずです。私は、より多くの要素がロードされるまで明示的に待つ方法を理解できませんでした(おそらく要素の数を取得し、スクロールして下にスクロールし、サブ要素+1が現れるのを待って、ループを終了しない場合)私は5つのスクロールイベントをハードコードし、time.sleepを使用しました。 time.sleepは醜いので、マシンの速度に依存するため、問題が発生する可能性があります。

def scrollElementToBottom(driver, element_id): 
time.sleep(.2) 
for i in range(5): 
    driver.execute_script("e = document.getElementById('" + element_id + "'); e.scrollTop = e.scrollHeight;") 
    time.sleep(.2) 

注意点は、次の解決策がFirefoxドライバで動作していたことですが、セットアップではうまくいかない理由はありません。

+0

答えていただきありがとうございます。私はかなり効率的にスクロールを停止するかどうかの判断に対応できると思います。あなたは「スクロール可能なコンテンツ」の意味をさらに詳しく説明してもらえますか?読み込んでいる追加のhtml要素を参照していますか?だから、私は基本的に最後のものを見つけてそれにスクロールし、最後の1つをスクロールして見つけて、最後の要素に達するまで繰り返します。 – theeastcoastwest

+0

"スクロール可能なコンテンツとは、追加要素ではなく、要素を保持しているスクロール可能な*コンテナ*を意味します。上記のコードは、最後の要素で使用しようとすると機能しません。 – eliotn

+0

ああ、私は今、理解していると信じています。私は今私のコンピュータからしばらく離れていますが、私はそのアプローチを試みます。 – theeastcoastwest

関連する問題