Python で動的コンテンツ (JavaScript で作成) を含むページをスクレイピングするにはどうすればよいですか? 質問する

Python で動的コンテンツ (JavaScript で作成) を含むページをスクレイピングするにはどうすればよいですか? 質問する

シンプルな Web スクレイパーを開発しようとしています。HTML マークアップのないプレーン テキストを抽出したいのですが、コードはプレーン (静的) HTML では機能しますが、ページに埋め込まれた JavaScript によってコンテンツが生成された場合には機能しません。

特に、urllib2.urlopen(request)ページ コンテンツを読むときに、JavaScript コードによって追加された内容は何も表示されません。これは、そのコードがどこにも実行されていないためです。通常は Web ブラウザーによって実行されますが、これは私のプログラムの一部ではありません。

Python コード内からこの動的コンテンツにアクセスするにはどうすればよいでしょうか?


Scrapy に固有の回答については、「Scrapy を使用して、AJAX を使用している Web サイトから動的コンテンツをスクレイピングできますか?」も参照してください。

ベストアンサー1

2021年9月編集:phantomjsメンテナンスも終了しました

編集 2017 年 12 月 30 日: この回答は Google 検索の上位結果に表示されたので、更新することにしました。古い回答はまだ最後に残っています。

dryscape はもうメンテナンスされておらず、dryscape 開発者が推奨するライブラリは Python 2 のみです。Selenium の Python ライブラリを Phantom JS とともに Web ドライバーとして使用すると、作業が十分に速く簡単に完了することがわかりました。

Phantom JSをインストールしたら、phantomjs現在のパスでバイナリが使用可能であることを確認します。

phantomjs --version
# result:
2.1.1

#例 例として、次の HTML コードでサンプル ページを作成しました。 (リンク):

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Javascript scraping test</title>
</head>
<body>
  <p id='intro-text'>No javascript support</p>
  <script>
     document.getElementById('intro-text').innerHTML = 'Yay! Supports javascript';
  </script> 
</body>
</html>

JavaScript がない場合、次のように表示されますNo javascript support。JavaScript がある場合、次のように表示されます。Yay! Supports javascript

#JS サポートなしでのスクレイピング:

import requests
from bs4 import BeautifulSoup
response = requests.get(my_url)
soup = BeautifulSoup(response.text)
soup.find(id="intro-text")
# Result:
<p id="intro-text">No javascript support</p>

#JS サポートによるスクレイピング:

from selenium import webdriver
driver = webdriver.PhantomJS()
driver.get(my_url)
p_element = driver.find_element_by_id(id_='intro-text')
print(p_element.text)
# result:
'Yay! Supports javascript'

Python ライブラリdryscrapeを使用して、JavaScript 駆動型 Web サイトをスクレイピングすることもできます。

#JS サポートによるスクレイピング:

import dryscrape
from bs4 import BeautifulSoup
session = dryscrape.Session()
session.visit(my_url)
response = session.body()
soup = BeautifulSoup(response)
soup.find(id="intro-text")
# Result:
<p id="intro-text">Yay! Supports javascript</p>

おすすめ記事