web-dev-qa-db-ja.com

python JavaScriptページでのリクエストの使用

python( http://docs.python-requests.org/en/latest/ )でリクエストフレームワークを使用しようとしていますが、私がしようとしているページjavascriptを使用して必要な情報を取得します。

私は解決策をウェブ上で検索しようとしましたが、私が得ているもののほとんどをキーワードjavascriptで検索しているという事実は、javascript言語でスクレイピングする方法です。

とにかくjavascriptを使用するページで要求フレームワークを使用する方法はありますか?

29
biw

JavaScriptが行っているのと同じリクエストを(Requestsライブラリを使用して)行う必要があります。任意の数のツール(ChromeおよびFirefoxに組み込まれているものを含む)を使用して、javascriptからのhttpリクエストを検査し、Pythonからこのリクエストを自分で行うことができます。

27
sberry

Seleniumは魅力的で便利に見えるかもしれませんが、修正できない主な問題が1つあります。それはパフォーマンスです。ブラウザが実行するすべてのことを計算することにより、より多くのパワーが必要になります。 PhantomJSでさえ、単純な要求と競合しません。ボタンをクリックする必要がある場合にのみSeleniumを使用することをお勧めします。 JavaScriptのみが必要な場合は、PyQtをお勧めします(確認するには https://www.youtube.com/watch?v=FSH77vnOGq を確認してください)。

ただし、Seleniumを使用する場合は、PhantomJSよりもChromeをお勧めします。多くのユーザーは、PhantomでWebサイトが機能しないというPhantomJSの問題を抱えています。 Chromeもヘッドレス(非グラフィカル)になります!

まず、ChromeDriverがインストールされていることを確認します。SeleniumはGoogle Chromeの使用に依存しています。

次に、URL chrome:// settings/helpで確認して、バージョン60以上のGoogle Chromeがあることを確認します

今、あなたがする必要があるのは次のコードだけです:

from Selenium.webdriver.chrome.options import Options
from Selenium import webdriver

chrome_options = Options()
chrome_options.add_argument("--headless")

driver = webdriver.Chrome(chrome_options=chrome_options)

Seleniumの使用方法がわからない場合は、簡単な概要を以下に示します。

driver.get("https://www.google.com") #Browser goes to google.com

要素の検索:ELEMENTSまたはELEMENTメソッドを使用します。例:

driver.find_element_by_css_selector("div.logo-subtext") #Find your country in Google. (singular)
  • driver.find_element(s)_by_css_selector(css_selector)#このCSSセレクターに一致するすべての要素
  • driver.find_element(s)_by_class_name(class_name)#次のクラスを持つすべての要素
  • driver.find_element(s)_by_id(id)#次のIDを持つすべての要素
  • driver.find_element(s)_by_link_text(link_text)#すべての完全なリンクテキスト
  • driver.find_element(s)_by_partial_link_text(partial_link_text)#部分的なリンクテキストを含むすべて。
  • driver.find_element(s)_by_name(name)#name = argumentのすべての要素
  • driver.find_element(s)_by_tag_name(tag_name)#タグ名引数を持つすべての要素

OK!要素(または要素リスト)を見つけました。しかし、私は今何をしますか?

要素elemで実行できるメソッドは次のとおりです。

  • elem.tag_name#。
  • elem.get_attribute( "id")#要素のIDを返します。
  • elem.text#要素の内部テキスト。
  • elem.clear()#テキスト入力をクリアします。
  • elem.is_displayed()#可視要素の場合はTrue、不可視要素の場合はFalse。
  • elem.is_enabled()#有効な入力の場合はTrue、そうでない場合はFalse。
  • elem.is_selected()#このラジオボタンまたはチェックボックス要素は選択されていますか?
  • elem.location#画面上の要素のXおよびY位置を表す辞書。
  • elem.click()#elemをクリックします。
  • elem.send_keys( "thelegend27")#thelegend27をelemに入力(テキスト入力に便利)
  • elem.submit()#elemが参加するフォームを送信します。

特殊コマンド:

  • driver.back()#戻るボタンをクリックします。
  • driver.forward()#「進む」ボタンをクリックします。
  • driver.refresh()#ページを更新します。
  • driver.quit()#すべてのタブを含むブラウザーを閉じます。
  • foo = driver.execute_script( "return 'hello';")#javascriptを実行します(戻り値を取得できます!)
16
Lil Taco

良いニュース:javascriptをサポートする要求モジュールがあります: https://pypi.org/project/requests-html/

from requests_html import HTMLSession

session = HTMLSession()

r = session('http://www.yourjspage.com')

r.html.render()  # this call executes the js in the page

ボーナスとして、これはBeautifulSoupをラップするので、次のようなことができると思います。

r.find('#myElementID').text

期待どおりにHTML要素のコンテンツを返します。

11
marvb

コメントするほどの評判はありませんが、パッケージ「requests_html」を使用して私の経験を共有したいと思います。

実際には、そのWebページのすべてをローカルにダウンロードして、すべてを実行します。私にはこれは非常に危険です。出力は次のとおりです。

r.html.render()  # this call executes the js in the page
[W:pyppeteer.chromium_downloader] start chromium download.
Download may take a few minutes.
100%|██████████| 84299992/84299992 [00:18<00:00, 4644126.66it/s]
[W:pyppeteer.chromium_downloader] 
chromium download done.
[W:pyppeteer.chromium_downloader] chromium extracted to: .../Library/Application Support/pyppeteer/local-chromium/575458
0
John