スクレイピングが禁止されているサイトでのクロールは犯罪です。
記載されていなくても節度を守り、日々感謝を忘れず情報取得をしましょう
スクレイピングとは
まぁ多分ほとんどの方は知っていると思いますが、Web上の情報を集めることです。
クローリングはWebサイトを自動で巡回することですね。
クローリングしながらスクレイピングをしていきます。
今回の記事の経緯
突然ですが株式分析にハマっていまして、バフェットコードなんかを使って色々見たりしているのですが、
いちいち会社のところまで行って業績を調べるのは面倒、、
スプレッドシートなんかにぱっとグラフでまとめてくれたら便利なのになぁと思っていました。
バフェットコードにもAPIはあるのですが、高すぎて新人のぺーぺーが買えるような代物ではありません。
よって、自前で何とかしなければならないのでした。
スクレイピング開始!
対象サイトは、よくあるやつです。正直怖いので「投資 スクレイピング 可能」とかで調べてみてください。多分何件かスクレイピングしても良い良心的な?サイトが出てくると思います(節度は守りましょうね!)
使うのはpython, excelです。
まずは下の設定を行います。(どうでもいい)
- python, VScode, Chromedriverのインストール
- venvの環境設定, pathの指定
- VScodeでpythonとpowershellのダウンロード
pythonではselenium, bs4を主に使っていきます。
グラフ化するなら多分matplotlibとはPILとかを使えばいいと思います。
excelとの関連付けはopenpyxlを使っています。
#URLの宣言
url = 'https://xxx.com'
#ドライバーを使ってurlを開いてもらう
driver = webdriver.Chrome('chromedriver.exe')
driver.get(url)
sleep(5)
#seleniumにより、NAME属性のuser_idの部分を取得し、自分のidを入力
userid = driver.find_element(By.NAME, 'user_id')
text_userid = 'xxxx'
sleep(3)
userid.send_keys(text_userid)
password = driver.find_element(By.NAME, 'user_pass')
text_password = 'xxxxx'
sleep(3)
password.send_keys(text_password)
#スクロールしてログインボタンをクリック
driver.execute_script("window.scrollBy(0, 500);")
sleep(2)
login_btn = driver.find_element(By.NAME, 'login')
login_btn.click()
sleep(2)
#目的のページまで行く
pointer = driver.find_element(By.CSS_SELECTOR, '#INNER-L > div.login > div..search_login > div.searchbox > ul > li.login > a')
pointer.click()
こんな感じで進んでいきます。
基本的に目的のページまで行くにはselenium,
ページのソースを持ってきて使いやすくするのはbs4って感じです。
続き
#ページソースをhtmlで格納
html = driver.page_source.encode('utf-8')
#bs4を使いパースする
soup0 = BeautifulSoup(html, "html.parser")
#ページの中のテーブルをtablesに格納
tables = soup.find_all('table', class_='leftTable')
#その後色々と処理をしていく
適当ですが大体こんな感じです。
とりあえずbs4でhtmlの使える部分を抽出していきます。
複数サイトやりたい場合は、またdriverを動かすなり、htmlをどっかにためておいて
後でbs4で一気に整形します。
excelへの保存はopenpyxlでやるのですが、簡単なので他のサイトで調べてください。
シート開いてセルを指定しながら、データフレームの行を書き写していくだけです。
躓いた点
Webサイトについて無知なもので、どうやらiframeという仕組みがあるみたいです。
他のページを現在のページに埋め込む技術らしいんですけど、これがあると上手くスクレイピングができません。(htmlを取り込むとiframe部分が消える)
なので、以下のようにスイッチしてあげる必要があります。
iframe = driver.find_element(By.TAG_NAME,'iframe')
driver.switch_to.frame(iframe)
私はこれに半日以上かけ悲しい思いをしました。
成果物
こんな感じです。
試作品なのでクオリティは許してください、、、
ちなみにバフェットコードのURLは会社のコードで分かれているため、自前でガッチャンこしているだけで、スクレイピング/クローリングはしてません。何とかしてバフェットコードを見たかったんです、、、
これで毎日実行にしてDB保存してグラフ作ってもいいですし、
もっと情報集めて、見たい指標だけ集めてもいいですね。
凄く適当な記事で申し訳ないですが、是非皆さんも安全に気を付けてやってみてください。