Pythonを使って無限スクロールのページをスクレイピングする方法

ハウツー, パイソン, スクレイピング, 11月-1520225分で読める

今日の世界では、誰もが新しいテクノロジーを活用している。ウェブスクレイピングの助けを借りて、自動化された方法で構造化データにアクセスすることができます。例えば、ウェブスクレイピングを利用することができる:エンドレススクロールとしても知られる無限スクロールは、ウェブサイトがAJAXやJavascriptを使用してよく使用するウェブデザインのテクニックです。

目次

今日の世界では、誰もが新しいテクノロジーを活用している。ウェブスクレイピングの助けを借りて、自動化された方法で構造化データにアクセスすることができます。例えば、あなたはウェブスクレイピングを利用することができる:

  • 価格モニタリング
  • リードジェネレーション
  • ニュース・モニタリング
  • 市場調査
  • 価格情報

エンドレススクロールとも呼ばれる無限スクロールは、ウェブデザインのテクニックのひとつで、AJAXやJavascriptと併用することで、ユーザーがウェブページの下までスクロールしたときに、追加コンテンツを動的に読み込むことができる。このテクニックは、ソーシャルメディアサイトでの成功により人気を博した。例えば、ツイッターの無限スクロールは、非同期ローディングによって実現されている。Twitterは、ページが読み込まれた後にAJAXコールを行い、スクロールに合わせて新しいコンテンツを追加し続ける。無限スクロールには多くの利点があるが、特定のコンテンツを見つけなければならないような、目標指向の検索作業にはお勧めできない。

まず、無限スクロールのページをスクレイピングすることの利点を理解しよう。

なぜ無限スクロールのページをスクレイピングする必要があるのか?

無限スクロールのページをスクレイピングする理由は以下の通り。

  • ユーザー・エンゲージメント - 無限にスクロールすることで、ユーザーはページを常に見ている。ツイッターやフェイスブックのようなソーシャルメディアサイトでは、ユーザーが作成したコンテンツが大量にスクロールされるため、ユーザーは常に夢中になっている。 
  • 少ないクリック数 - スクロールは少ないアクションで済み、ユーザーにとってはクリックよりも簡単です。
  • モバイルに最適 - 無限スクロールは、モバイルデバイスやタッチスクリーンに最適です。ユーザーは新しいタブに切り替える代わりに、下にスワイプして新しいコンテンツを生成することができます。 

無限スクロールのページをスクレイピングする上記の利点とは別に、以下のような短所もある:

  • 検索エンジン最適化(SEO)には向いていない。
  • 身体の不自由なユーザーにとって、無限スクロールのページをナビゲートするのは容易ではない。
  • 無限スクロールのウェブサイトはロード時間が長くなる可能性があり、それはユーザー側から来る場合もあれば、開発側から来る場合もある。

Pythonを使って無限スクロールのページをスクレイピングする方法

Pythonを使って無限スクロールのページをスクレイピングする方法を見てみよう。

ライブラリのインポート

Seleniumライブラリをインポートする必要があります。

fromseleniumimportwebdriver
fromselenium.webdriver.common.keysimportKeys    
インポート時間

セレニウムのセットアップ

ここで、使用するブラウザを選択する必要がある。FirefoxよりChromeの方がオプションが多いので、Chromeを使うことにする。 

defget_selenium():                          
  オプション= webdriver.ChromeOptions()
  options.add_argument('--ignore-certificate-errors')
  options.add_argument('--incognito')
  options.add_argument('headless')                       
   driver = webdriver.Chrome(chrome_options=options)
  return(driver)

上記のヘッドレス引数はかなり重要です。SeleniumはPythonのヘッドレス実行時にChromeを新しいウィンドウで開きません。しかし、スクレイピング中に問題が発生した場合、headlessオプションをコメントすることで、Chromeで何が起こっているのか、ページに何が読み込まれているのかを確認することができます。

ignore-certificate-errorsとincognitoの2つのフラグは省略できる。

キャプチャやクッキー・バナーが表示されてページが読み込めない場合は、OKをクリックして普通にページに進むことができる。しかし、ブラウザが予期せず閉じてしまった場合は、time.sleep()を使ってコードを一時停止し、デバッグのための十分な時間を取ることができます。

無限スクロールの修正

無限スクロールを修正するには、ページのHTML構造を調べ、以下の手順を踏む必要があります。

  • ページに最後に読み込まれた要素を見つけなければならない。
  • その要素までスクロールダウンするにはSeleniumを使わなければならない。
  • ページがより多くのコンテンツを読み込むのを待つには、time.sleep()を使う。
  • ページに読み込まれた最後の要素までもう一度スクロールする。
  • ページの最後まで同じ作業を繰り返す必要がある。

以下の例を参考にしてほしい。

selenium = get_selenium()              
selenium.get("your/url")   
last_elem =''
while True:
   current_last_elem ="#my-div > ul > li:last-child"
   scroll ="document.querySelector(♪'+ current_last_elem +"♪').scrollIntoView();"
   selenium.execute_script(スクロール)
   time.sleep(3)
  if(last_elem == current_elem)
     ブレーク
  else
      last_elem = current_elem

上記のコードでは、Pythonの中でjQueryとJavascriptを使っている。 

ここだよ、

  • 私たちは、URLページを開くselenium.get()関数を使いました。しかし、URL検索にキーワードを追加したい場合は、次のコードの行を使用することができます。
selenium.get("あなたの/url.com/{0}".format(キーワード))
  • last_timeには空の文字列を格納して0に初期化した。
  • CSS_selectorまたはXpathを使ってcurrent_last_elemを取得するwhileループを使用した。パスを取得するには、以下の手順に従います。 ページを開きます。パスが必要な要素を選択するには、webdevツールを使う必要があります。このチュートリアルに従って、ページのHTML構造で要素を選択し、ChromeでXpathを取得することができます。
  • あなたのページを開いてください。
  • パスが必要な要素を選択するには、ウェブデバイスツールを使用する必要があります。このチュートリアルに従って、ページのHTML構造で要素を選択し、ChromeでXpathを取得することができます。
  • 選択した要素までページをスクロールさせるために、jQueryとscrollIntoView()を使用した。 
"document.querySelector(\') + .. + "document.querySelector( \').scrollIntoView();"

ここでは、書式が正しくなければならないので、一重引用符と二重引用符、そしてエスケープ文字に注意する必要がある。

  • selenium.execute_script()を使ってjsスクリプトを実行する。
  • ページがロードされるのに十分な時間を与え、最後の要素を見つけられるようにする必要がある。そのため、time.sleep()関数は数秒間実行を一時停止する重要な関数です。ページが読み込まれるのに十分な時間を与えないと、スクロールが止まってしまい、未定義の結果が得られます。
  • ページの下までスクロールするたびに、新しい最後の要素が見つかるかどうかをチェックする。見つかった場合は、まだページの最後に到達していないことを意味し、スクロールを続ける必要がある。見つからなければ、ページのスクロールが終了したことを意味し、ループから抜け出すことができる。

頻発する問題の解決

無限スクロールを行う際によく発生する問題には、以下のようなものがある:

  • 最後の要素への正しいXpathを見つけるのに時間がかかります。jsスクリプトのシングルクォートとダブルクォートをチェックする必要があります。
  • もしundefinedが表示されたり、毎回同じ最後の要素が表示される場合は、ページを完全にロードするのに十分な時間がない可能性があるため、time.sleep()の時間を長くする必要があります。 
  • すべてが正しければ、get_selenium()のheadlessオプションをコメントアウトすることができるが、それでも動作しない。

Pythonでjsをトリガーする

Pythonの中からjsスクリプトをトリガーし、結果としてリストを取得することが可能です。 

例えば、以下のコードを使って、ページ上のすべての画像からソースを取得することができる。

js_script='''٩(*´꒳`*)۶''                   
var jslist = [].   
document.querySelectorAll('img').forEach(i => jslist.push(i.src));
jslist を返します;
'''   
python_list= selenium.execute_script(js_script)

上記のコードでは

  • jslistという空の配列を作成した。
  • ページ内のすべてのimgタグを選択した。
  • 配列の各 img.src をプッシュするために forEach を使用しました。
  • jslistを返却した。

同じ方法をhrefリンクにも使うことができる:

  • すべての "a "タグを選択する。
  • すべてのa.hrefを配列にプッシュする。

その後、selenium.execute_script()でスクリプトを実行することができます。jsによって返された値をpython変数、すなわちpython_listにストックすることができます。 

これがPythonを使って無限スクロールのページをスクレイピングする方法だ。

プロキシの使用

プロキシは、リソースを要求するクライアントとリソースを提供するサーバーの間で仲介するサードパーティ製のサーバーであることはご存じでしょう。 SeleniumとPythonでプロキシを使いたい場合、次のコード行を使うことができます。

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=%s'% hostname +": "+port)
driver = webdriver.Chrome(chrome_options=chrome_options)

無限スクロールを処理するには、ビュー階層内のスクロール可能なビューのプログラムによるスクロールをサポートするscroll-proxyを使用できます。npmを使用している場合は、以下のコマンドを使用してscroll-proxyをインストールできます。ここではjsを使ってscroll-proxyの使い方を説明する。

npm installscroll-proxy--save

ScrollProxyをインストールしたら、以下のコードでScrollProxyオブジェクトをインスタンス化できます。

varmyScroll =new ScrollProxy();

ScrollProxy コンストラクタに引数を渡していないことがわかります。

しかし、ユーザーが特定のHTML要素内でスクロールしたときに更新を取得したい場合は、コンストラクタにその要素を渡す必要がある。

varmyDiv =document.querySelector('.scrollable');
varmyDivScroll =newScrollProxy(myDiv);

なぜ無限スクロールのスクレイピングにプロキシを使うのか?

以下は、無限スクロールのスクレイピング中にプロキシを使用するいくつかの理由です。

  • キャプチャはページがタイムアウトする原因となり、スクレイパーをブロックする可能性があります。頻繁にタイムアウトエラーが発生する場合は、手動でページをチェックしてキャプチャを探すことができます。ほとんどのキャプチャはセキュリティ対策によってトリガーされるので、スクレイパーと一緒にローテーション・レジデンシャル・プロキシを使って回避することができる。
  • サイトによっては、ユーザーエージェントがボットである可能性があるという仮定や可能性に基づいて、疑わしいヘッダーリクエストをフィルタリングすることを好む。あなたがボットであることを知らせるのを避けるために、IPアドレスを変更し、あなた(ユーザーエージェント)のための赤旗を防ぐことができるプロキシを使用することができます。 

結論

ユーザーが特定の情報を探していない場合、無限スクロールが好まれることを説明した。常に新しいコンテンツを生成するニュースサイトやソーシャルメディアフィードは、無限スクロールの恩恵を受けることができます。一方、ビジネスページやEコマースサイトは、ユーザーが特定の情報を求めているため、無限スクロールには向いていません。さらに、Seleniumを使って無限スクロールページをスクレイピングする手順についても説明した。また、無限スクロールを処理するために、キャプチャを回避し、疑わしいヘッダーリクエストをフィルタリングするのに役立つ回転住宅プロキシを使用することもできます。

Pythonを使って無限スクロールページをスクレイピングする方法を理解していただけたでしょうか。