10 行のコードで BS4 を使用した Web スクレイピング Sprott U Fund


私は約 10 年前に核燃料ウラン トレーダーとして 2 番目のキャリアを始めました.数年後、冗長な情報が散在する 7 つを超えるスプレッドシートを使用してシステムをアップグレードすることを会社が拒否したことに不満を感じたので、データベース、データ エンジニアリング、および Python を使用して物事を自動化する方法について学ぶ旅を始めました.現在、私の uranium-focused dashboard でバックグラウンドのコンテキスト データとしてスクレイピングしているデータポイントの 1 つ (コンポーネントに入れる時間ができるまで!) は、市場の新参者である Sprott Uranium Fund の毎日更新される Web サイトからスクレイピングされたデータです.これは、Python Package bs4 を使用してそれを行う方法に関するチュートリアルです.

まず、パッケージをインポートします

import requests
from bs4 import BeautifulSoup


次に、 requests パッケージを使用して Web サイトをリクエストします.応答が 200 で成功した場合は、 BeautifulSoup を使用して解析します.

url = 'https://sprott.com/investment-strategies/physical-commodity-funds/uranium/'
r = requests.get(url)
if r.status_code == 200:
    soup: BeautifulSoup = BeautifulSoup(r.content, "html.parser")


おめでとう!これで、コンピューターのメモリにローカルに Web ページが作成されました.しかし、どのようにして彼らの株価とファンドが現在保有しているウランの量を抽出するのでしょうか?

その URL に移動し、開発者のビューを開いて要素を確認したり、ブラウザーでページ全体のソース コードを確認したり、BeautifulSoup の prettify() 関数を使用して Jupyter Notebook で print(soup.prettify() を確認したりできます.

ページの 5 分の 1 あたりに株価とウランの量が表示されます.ここに私が見ているもののサンプルがあります:

<div class="cell small-6 large-3 fundHeader_data">
            <h3 class="fundHeader_title">
             Premium/Discount
            </h3>
            <div class="fundHeader_value">
             -2.55%
            </div>
            <!-- <div class="fundHeader_detail">52 wk: <strong>$31.45 - $45.98</strong></div>-->
           </div>
           <div class="cell small-6 large-3 fundHeader_data">
            <h3 class="fundHeader_title mt05">
             Total lbs of U
             <sub>
              3
             </sub>
             O
             <sub>
              8
             </sub>
            </h3>
            <div class="fundHeader_value">
             40,780,707
            </div>


値は「fundHeader_value」と呼ばれる div class に保存されます.それらすべてを取得し、株価とウラン株を含むものを抽出するには、BeautifulSoup findall 関数を使用して、fund_values という変数 (リスト) に格納します.

fund_values = soup.find_all('div', class_='fundHeader_value')


株価はそのリストの 4 番目の値であるため、Python リスト スライスを使用し、コンテンツ関数を呼び出して、Python で操作できる方法で取得します.

shareprice = fund_values[4].contents


変数の株価を表示すると、不要なものが大量に表示されます.

['\r\n                                    $US11.81\r\n                                                ', <span class="fundHeader_icon fundHeader_icon--pos"><i data-feather="trending-up"></i></span>, '\n']


まず、このリストの最初の項目の内容、つまり shareprice[0] が必要です.次に、その周りの他のもの、つまり空白とキーリターンを取り除きたいと思います.文字列オブジェクトを操作していることを確認するには、Python に str(shareprice[0]) を使用して文字列として認識するように指示できます. Python には .strip() で空白を「取り除く」ための非常に強力な方法があるため、文字列 str(shareprice[0]).strip() の後にそれを呼び出します.

これにより、文字列として $US11.81 が得られます.それが必要な場合は、ここで終了できますが、チャートに入れたり、数値としてデータベースに保存したりする場合は、$US も削除する必要があります.幸いなことに、Python には、文字列の不要な部分を何も「置き換える」別の方法があります. .replace('$US','') を入れるだけで、11.81 が返されます.

これは 1 行のテキストの長い説明でしたが、Python がいかに簡潔に物事を成し遂げることができるかを示しています!

shareprice_value = str(shareprice[0]).strip().replace('$US','')


ウラン量はどうですか?簡単...すすぎと繰り返し.唯一の違いは、 $US の代わりにコンマがあり、 fund_values のリストの 6 番目の項目であることです.

u3o8 = fund_values[6].contents
u3o8_stock = str(u3o8[0]).strip().replace(',','')


これで、ファンドの Web サイトを 10 行のコードでスクレイピングできました (Uranium Volumes の余分な 2 行を数えれば 12 行).

いいねでドーパミンレベルを上げてください.ここにもっと技術的なことを書いてみます.

コードは次のとおりです.

import requests
from bs4 import BeautifulSoup

url = 'https://sprott.com/investment-strategies/physical-commodity-funds/uranium/'
r = requests.get(url)
if r.status_code == 200:
    soup: BeautifulSoup = BeautifulSoup(r.content, "html.parser")

fund_values = soup.find_all('div', class_='fundHeader_value')
shareprice = fund_values[4].contents
shareprice_value = str(shareprice[0]).strip().replace('$US','')

u3o8 = fund_values[6].contents
u3o8_stock = str(u3o8[0]).strip().replace(',','')