結局Webページの表の中のデータを取得するのはpandasとlxmlどっちがいいの?
結局Webページの表の中のデータを取得するのはPandasとlxmlどっちがいいの?
結果としては、表形式と決まっていればpandas、汎用性があるのはlxmlという所感
今回は、Yahoo!ファイナンスのページの表の特定のデータをpandasとlxmlでそれぞれの方法で取得してみる
参考:Yahoo!ファイナンス
具体的には、「WisdomTree 天然ガス上場投信」の「出来高」である「10,037,700 」の数字を取得する
事前準備
Webページの情報をcURLで取得する場合は、以下のコマンドである
参考:ChromeでcURLコマンドを簡単に取得する方法メモ
% curl "https://info.finance.yahoo.co.jp/ranking/?kd=1&tm=d&mk=1"
一からPython書くのは面倒なので、以下のサイトでPython化する
参考:Convert curl syntax to Python, Ansible URI, MATLAB, Node.js, R, PHP, Strest, Go, Dart, JSON, Elixir, Rust
変換すると以下のようなコードになる
import requests params = ( ('kd', '1'), ('tm', 'd'), ('mk', '1'), ) response = requests.get('https://info.finance.yahoo.co.jp/ranking/', params=params)
このコードを元に作成する
Pythonバージョンは以下の通り
% python -V Python 3.9.1
pandasでWeb上の表の特定のデータを取得する方法
必要モジュールをインストール
% pip install requests % pip install pandas
% pip freeze certifi==2020.12.5 chardet==4.0.0 idna==2.10 numpy==1.20.1 pandas==1.2.2 python-dateutil==2.8.1 pytz==2021.1 requests==2.25.1 six==1.15.0 urllib3==1.26.3
一旦以下のコードで全部を取得する
「pd.set_option(‘display.max_columns’, None)」はセルの中身を省略しないようにする設定
% cat pandas_test.py #/Users/yoshi/.pyenv/shims/python # coding: utf-8 import requests import pandas as pd pd.set_option('display.max_columns', None) params = ( ('kd', '1'), ('tm', 'd'), ('mk', '1'), ) response = requests.get('https://info.finance.yahoo.co.jp/ranking/', params=params) htmlData = response print(pd.read_html(htmlData.text))
pandasを利用するときはlxmlも必要とのことなのでインストールする
% python pandas_test.py Traceback (most recent call last): ...(略)... raise ImportError("lxml not found, please install it") ImportError: lxml not found, please install it
% pip install lxml
結局必要モジュールはこんな感じ
% pip freeze certifi==2020.12.5 chardet==4.0.0 idna==2.10 lxml==4.6.2 numpy==1.20.1 pandas==1.2.2 python-dateutil==2.8.1 pytz==2021.1 requests==2.25.1 six==1.15.0 urllib3==1.26.3
取得するとこんな感じになる
% python pandas_test.py [ 順位 コード 市場 名称 取引値 取引値.1 前日比 前日比.1 \ 0 1 1689 東証ETF WisdomTree 天然ガス上場投信 03/19 2 +100.00% +1 1 2 7519 東証JQS 五洋インテックス(株) 03/19 168 +42.37% +50 2 3 6659 東証JQS (株)メディアリンクス 03/19 638 +21.76% +114 3 4 4512 東証1部 わかもと製薬(株) 03/19 654 +18.05% +100 4 5 4885 東証JQS 室町ケミカル(株) 03/19 1584 +17.94% +241 5 6 5610 東証2部 大和重工(株) 03/19 1038 +16.89% +150 6 7 1773 東証1部外国 YTL 03/19 21 +16.67% +3 7 8 6337 東証JQS (株)テセック 03/19 1568 +12.00% +168 8 9 6982 東証2部 (株)リード 03/19 785 +11.98% +84 9 10 4777 東証JQS (株)ガーラ 03/19 267 +11.72% +28 10 11 3856 東証2部 Abalance(株) 03/19 4860 +11.47% +500 11 12 1574 東証ETF MAXISトピックスリスクコントロール(10%) 03/19 1680 +10.53% +160 12 13 8337 東証1部 (株)千葉興業銀行 03/19 325 +10.17% +30 13 14 3464 東証1部 プロパティエージェント(株) 03/19 2300 +10.15% +212 14 15 7060 東証1部 ギークス(株) 03/19 1768 +9.54% +154 15 16 7087 東証2部 (株)ウイルテック 03/19 1080 +9.20% +91 16 17 2986 東証JQG (株)LAホールディングス 03/19 1398 +9.05% +116 17 18 7695 マザーズ (株)交換できるくん 03/19 4600 +9.00% +380 18 19 4598 マザーズ Delta−Fly Pharma(株) 03/19 1371 +8.81% +111 19 20 2780 東証2部 (株)コメ兵ホールディングス 03/19 960 +8.60% +76 20 21 4447 福岡Q (株)ピー・ビーシステムズ 03/19 970 +8.50% +76 21 22 8844 東証JQS (株)コスモスイニシア 03/19 466 +8.37% +36 22 23 7184 東証1部 (株)富山第一銀行 03/19 355 +8.23% +27 23 24 8894 東証2部 (株)REVOLUTION 03/19 40 +8.11% +3 24 25 6074 東証JQS (株)ジェイエスエス 03/19 574 +8.10% +43 25 26 8209 東証2部 (株)フレンドリー 03/19 538 +8.03% +40 26 27 6969 東証2部 松尾電機(株) 03/19 623 +7.97% +46 27 28 5282 東証2部 ジオスター(株) 03/19 419 +7.71% +30 28 29 9904 東証2部 (株)ベリテ 03/19 470 +7.55% +33 29 30 5690 東証2部 リバーホールディングス(株) 03/19 1089 +7.50% +76 30 31 3976 マザーズ (株)シャノン 03/19 2612 +7.45% +181 31 32 8537 東証1部 (株)大光銀行 03/19 1626 +7.33% +111 32 33 8708 東証1部 藍澤證券(株) 03/19 1147 +7.30% +78 33 34 2068 東証ETF NEXT NOTES 高ベータ30(NR)ETN 03/19 13780 +6.99% +900 34 35 8360 東証1部 (株)山梨中央銀行 03/19 1035 +6.92% +67 35 36 7963 東証JQS 興研(株) 03/19 2075 +6.90% +134 36 37 3393 東証1部 スターティアホールディングス(株) 03/19 1288 +6.89% +83 37 38 8609 東証1部 (株)岡三証券グループ 03/19 499 +6.85% +32 38 39 8624 東証1部 いちよし証券(株) 03/19 663 +6.76% +42 39 40 7150 東証1部 (株)島根銀行 03/19 765 +6.69% +48 40 41 8511 東証1部 日本証券金融(株) 03/19 760 +6.59% +47 41 42 7462 東証JQS ダイヤ通商(株) 03/19 2590 +6.58% +160 42 43 8562 東証1部 (株)福島銀行 03/19 310 +6.53% +19 43 44 3032 名古屋セ (株)ゴルフ・ドゥ 03/19 474 +6.52% +29 44 45 4762 東証1部 (株)エックスネット 03/19 1132 +6.39% +68 45 46 4554 東証1部 富士製薬工業(株) 03/19 1418 +6.38% +85 46 47 8354 東証1部 (株)ふくおかフィナンシャルグループ 03/19 2407 +6.36% +144 47 48 3377 東証2部 (株)バイク王&カンパニー 03/19 523 +6.30% +31 48 49 8563 東証1部 (株)大東銀行 03/19 783 +6.24% +46 49 50 9880 東証1部 イノテック(株) 03/19 1417 +6.22% +83 50 順位 コード 市場 名称 取引値 取引値 前日比 前日比 出来高 掲示板 0 10037700 掲示板 1 4188000 掲示板 2 8624800 掲示板 3 173300 掲示板 4 5318300 掲示板 5 13100 掲示板 6 3044000 掲示板 7 115500 掲示板 8 144600 掲示板 9 3967700 掲示板 10 385400 掲示板 11 250 掲示板 12 1499900 掲示板 13 126900 掲示板 14 263800 掲示板 15 58800 掲示板 16 249100 掲示板 17 210000 掲示板 18 333900 掲示板 19 113900 掲示板 20 22400 掲示板 21 134300 掲示板 22 236700 掲示板 23 5041000 掲示板 24 34300 掲示板 25 21600 掲示板 26 800100 掲示板 27 313900 掲示板 28 969700 掲示板 29 1072700 掲示板 30 134500 掲示板 31 17200 掲示板 32 122700 掲示板 33 499 掲示板 34 407700 掲示板 35 74800 掲示板 36 149300 掲示板 37 1599300 掲示板 38 823100 掲示板 39 31400 掲示板 40 1246800 掲示板 41 26200 掲示板 42 1486400 掲示板 43 7600 掲示板 44 58300 掲示板 45 642400 掲示板 46 3238000 掲示板 47 530400 掲示板 48 105800 掲示板 49 606500 掲示板 50 出来高 掲示板 ]
特定のセル(「WisdomTree 天然ガス上場投信」の「出来高」である「10,037,700 」の数字)を取得するには、以下のように書き換える
※一つ目の表の([0])出来高という列の([‘出来高’])一番最初のセル([0])
% cat pandas_test_2.py #/Users/yoshi/.pyenv/shims/python # coding: utf-8 import requests import pandas as pd pd.set_option('display.max_columns', None) params = ( ('kd', '1'), ('tm', 'd'), ('mk', '1'), ) response = requests.get('https://info.finance.yahoo.co.jp/ranking/', params=params) htmlData = response print(pd.read_html(htmlData.text)[0]['出来高'][0])
うまく取得できた
% python pandas_test_2.py 10037700
lxmlでWeb上の表の特定のデータを取得する方法
必要モジュールのインストール
% pip install requests % pip install lxml
% pip freeze certifi==2020.12.5 chardet==4.0.0 idna==2.10 lxml==4.6.2 requests==2.25.1 urllib3==1.26.4
まずは以下のコードで表の全データを取得してみる
テーブルのXPath(’/html/body/div/div[2]/div[3]/div[2]/div[3]/table’)を指定して表示する
参考:xpathをchromeで取得する方法メモ
% cat lxml_test.py #/Users/yoshi/.pyenv/shims/python # coding: utf-8 import requests import lxml.html params = ( ('kd', '1'), ('tm', 'd'), ('mk', '1'), ) response = requests.get('https://info.finance.yahoo.co.jp/ranking/', params=params) htmlData = response xPath = '/html/body/div/div[2]/div[3]/div[2]/div[3]/table' htmlContents = lxml.html.fromstring(htmlData.content).xpath(xPath) print(htmlContents[0].text_content())
結果はこんな感じ、まあこれから特定のセルを取得するので見栄えはおいといて、、
% python lxml_test.py 順位コード市場名称取引値前日比出来高掲示板 11689東証ETFWisdomTree 天然ガス上場投信03/192+100.00%+110,037,700掲示板27519東証JQS五洋インテックス(株)03/19168+42.37%+504,188,000掲示板36659東証JQS(株)メディアリンクス03/19638+21.76%+1148,624,800掲示板44512東証1部わかもと製薬(株)03/19654+18.05%+100173,300掲示板54885東証JQS室町ケミカル(株)03/191,584+17.94%+2415,318,300掲示板65610東証2部大和重工(株)03/191,038+16.89%+15013,100掲示板71773東証1部外国YTL03/1921+16.67%+33,044,000掲示板86337東証JQS(株)テセック03/191,568+12.00%+168115,500掲示板96982東証2部(株)リード03/19785+11.98%+84144,600掲示板104777東証JQS(株)ガーラ03/19267+11.72%+283,967,700掲示板113856東証2部Abalance(株)03/194,860+11.47%+500385,400掲示板121574東証ETFMAXISトピックスリスクコントロール(10%)03/191,680+10.53%+160250掲示板138337東証1部(株)千葉興業銀行03/19325+10.17%+301,499,900掲示板143464東証1部プロパティエージェント(株)03/192,300+10.15%+212126,900掲示板157060東証1部ギークス(株)03/191,768+9.54%+154263,800掲示板167087東証2部(株)ウイルテック03/191,080+9.20%+9158,800掲示板172986東証JQG(株)LAホールディングス03/191,398+9.05%+116249,100掲示板187695マザーズ(株)交換できるくん03/194,600+9.00%+380210,000掲示板194598マザーズDelta−Fly Pharma(株)03/191,371+8.81%+111333,900掲示板202780東証2部(株)コメ兵ホールディングス03/19960+8.60%+76113,900掲示板214447福岡Q(株)ピー・ビーシステムズ03/19970+8.50%+7622,400掲示板228844東証JQS(株)コスモスイニシア03/19466+8.37%+36134,300掲示板237184東証1部(株)富山第一銀行03/19355+8.23%+27236,700掲示板248894東証2部(株)REVOLUTION03/1940+8.11%+35,041,000掲示板256074東証JQS(株)ジェイエスエス03/19574+8.10%+4334,300掲示板268209東証2部(株)フレンドリー03/19538+8.03%+4021,600掲示板276969東証2部松尾電機(株)03/19623+7.97%+46800,100掲示板285282東証2部ジオスター(株)03/19419+7.71%+30313,900掲示板299904東証2部(株)ベリテ03/19470+7.55%+33969,700掲示板305690東証2部リバーホールディングス(株)03/191,089+7.50%+761,072,700掲示板313976マザーズ(株)シャノン03/192,612+7.45%+181134,500掲示板328537東証1部(株)大光銀行03/191,626+7.33%+11117,200掲示板338708東証1部藍澤證券(株)03/191,147+7.30%+78122,700掲示板342068東証ETFNEXT NOTES 高ベータ30(NR)ETN03/1913,780+6.99%+900499掲示板358360東証1部(株)山梨中央銀行03/191,035+6.92%+67407,700掲示板367963東証JQS興研(株)03/192,075+6.90%+13474,800掲示板373393東証1部スターティアホールディングス(株)03/191,288+6.89%+83149,300掲示板388609東証1部(株)岡三証券グループ03/19499+6.85%+321,599,300掲示板398624東証1部いちよし証券(株)03/19663+6.76%+42823,100掲示板407150東証1部(株)島根銀行03/19765+6.69%+4831,400掲示板418511東証1部日本証券金融(株)03/19760+6.59%+471,246,800掲示板427462東証JQSダイヤ通商(株)03/192,590+6.58%+16026,200掲示板438562東証1部(株)福島銀行03/19310+6.53%+191,486,400掲示板443032名古屋セ(株)ゴルフ・ドゥ03/19474+6.52%+297,600掲示板454762東証1部(株)エックスネット03/191,132+6.39%+6858,300掲示板464554東証1部富士製薬工業(株)03/191,418+6.38%+85642,400掲示板478354東証1部(株)ふくおかフィナンシャルグループ03/192,407+6.36%+1443,238,000掲示板483377東証2部(株)バイク王&カンパニー03/19523+6.30%+31530,400掲示板498563東証1部(株)大東銀行03/19783+6.24%+46105,800掲示板509880東証1部イノテック(株)03/191,417+6.22%+83606,500掲示板 順位コード市場名称取引値前日比出来高掲示板
特定のセル(「WisdomTree 天然ガス上場投信」の「出来高」である「10,037,700 」の数字)を取得するには、以下のように書き換える
※xPathの値を表全体ではなくセルにするだけ
% cat lxml_test_2.py #/Users/yoshi/.pyenv/shims/python # coding: utf-8 import requests import lxml.html params = ( ('kd', '1'), ('tm', 'd'), ('mk', '1'), ) response = requests.get('https://info.finance.yahoo.co.jp/ranking/', params=params) htmlData = response xPath = '//*[@id="contents-body-bottom"]/div[2]/div[3]/table/tbody/tr[1]/td[9]' htmlContents = lxml.html.fromstring(htmlData.content).xpath(xPath) print(htmlContents[0].text_content())
実行結果は以下の通りで、xlmlでも無事に取得できた
% python lxml_test_2.py 10,037,700
以上。