2017-01-11 3 views
0

さまざまな期間を調べるインタラクティブな機能を備えたHTMLテーブルから情報をスクレープしようとしています。テーブルの例はhttp://quotes.freerealtime.com/dl/frt/M?IM=quotes&type=Time%26Sales&SA=quotes&symbol=IBM&qm_page=45750のURLにあります。Pythonを使用してHTMLテーブルを読み込んで対話する

私は9時30分に開始してから、1分前にジャンプしてテーブルと対話したいと思います。私はすべてのデータをDataFrameにエクスポートしたいと思います。 私はpandas.read_html()を使ってみましたが、BeautifulSoupを使ってみました。私はBeautifulSoupで経験していませんが、これらのどちらも私のために働いていません。私の要求は可能ですか、ウェブスクラップからこの情報をウェブサイトで保護していますか?どんな助けもありがとう!このページではJavaScriptによってレンダリングされる

+0

セレン特有のアプローチに興味がありますか? – alecxe

+0

はい、間違いなく! – Evy555

答えて

1

ページはかなり動的です(少なくとも私の側では非常に遅いです)。JavaScriptと複数の非同期要求がデータを取得します。 requestsでそれに近づくことは容易ではないでしょう。たとえば、seleniumなどのブラウザー・オートメーションを使用する必要があります。

ここから始めてください。あちこちExplicit Waitsの使用に注意してください:

import pandas as pd 
import time 

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.select import Select 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 


driver = webdriver.Firefox() 
driver.maximize_window() 
driver.get("http://quotes.freerealtime.com/dl/frt/M?IM=quotes&type=Time%26Sales&SA=quotes&symbol=IBM&qm_page=45750") 

wait = WebDriverWait(driver, 400) # 400 seconds timeout 

# wait for select element to be visible 
time_select = Select(wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "select[name=time]")))) 

# select 9:30 and go 
time_select.select_by_visible_text("09:30") 
driver.execute_script("arguments[0].click();", driver.find_element_by_id("go")) 
time.sleep(2) 

while True: 
    # wait for the table to appear and load to pandas dataframe 
    table = wait.until(EC.presence_of_element_located((By.ID, "qmmt-time-and-sales-data-table"))) 
    df = pd.read_html(table.get_attribute("outerHTML")) 
    print(df[0]) 

    # wait for offset select to be visible and forward it 1 min 
    offset_select = Select(wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "select[name=timeOffset]")))) 
    offset_select.select_by_value("1") 

    time.sleep(2) 

    # TODO: think of a break condition 

注これは私のマシン上で本当に、本当に遅い動作し、私はそれがあなたの上で実行する方法をうまくわからないが、それは継続的に無限に前方に1分を進めていることループ(ある時点で停止する必要があります)。

+0

ありがとう!これを実行中にエラーが発生しています。メッセージ: 'geckodriver'実行ファイルはPATHにある必要があります – Evy555

+0

@ Evy555ええ、それは[現在のselenium/firefoxの一般的な問題です](http://stackoverflow.com/questions/40208051/selenium-using-python-geckodriver-executable-パスの必要性)が含まれています。 – alecxe

0

ブラウザでJSを無効にしている場合は、このページの出力は次のようになります。

enter image description here

要求やパンダは、HTMLコードのみを扱います。

+0

JavaScriptで表示されるため、情報にアクセスできません。 – Evy555

+0

@ Evy555はい、ブラウザとやり取りする場合は、セレンを使用してください。 –

関連する問題