Webスクレイピングに挑戦
5月2日(金)は、Webスクレイピングに挑戦しました。
- 18時00分~18時30分 タイピング練習
- 18時30分~19時50分 Webスクレイピング写経と内容の説明
- 19時50分~20時00分 後片付け
タイピング練習とPaizaで自習
タイピングの練習は、変わらず下のツールを使っています。
無料タイピング https://manabi.benesse.ne.jp/gakushu/typing
まじめにコツコツと淡々と練習するメンバーもいれば、なかなか練習に身のはいらないメンバーもいます。それぞれです。
しかし、タイピングは正しく練習すれば一定程度まで上達します。練習すれば必ず身につくスキルです。
Webスクレイピングに挑戦する
Webスクレイピングは、Webから必要なデータ(情報)を抜き出してくる技術です。たとえば、Amazonのような通販サイトに表示される商品と価格を一覧でほしい場合などに使います。
いちいち商品ページをさがして商品名と価格を取得するのは時間がかかります。そこで、プログラムで自動化しようという話です。
実際、わたしに依頼があった案件では、アパレル販売と家具販売の会社からメーカーの在庫取得のためにスクレイピングしてほしいという案件がありました。
さて、まずはスクレイピングの基本形を写経します。
import requests
from bs4 import BeautifulSoup
import pandas as pd
import re
import time
# URL
url = "https://www.yahoo.co.jp/"
# URLにアクセスする
req = requests.get(url)
# res.textをBeautifulSoupで扱うための処理
soup = BeautifulSoup(req.content, "html.parser")
# href属性に特定の文字が含まれているものを検索
elems = soup.find_all(href=re.compile("news.yahoo.co.jp/pickup"))
# 取得した情報の数
num = len(elems)
# データを一時保管する箱を作成
news = [ ['','',''] for _ in range(num)]
# 保存するときにタイトル行はいれるので、データのみ格納
i = 0
for elem in elems:
# ハイライト記事の取得
res_detail = requests.get(elem.attrs['href'])
soup_detail = BeautifulSoup(res_detail.content, "html.parser")
elems_detail = soup_detail.find(class_=re.compile("highLightSearchTarget"))
# データの格納
news[i][0] = elem.text
news[i][1] = elem.attrs['href']
if elems_detail is not None: #たまにハイライト記事がないときがある 例外処理
news[i][2] = elems_detail.text
else:
news[i][2] = None
# サーバに負荷をかけないように待機(秒)
time.sleep(1)
i = i + 1
df = pd.DataFrame(news, columns=["title", "url", "highlight"])
df.to_csv("data_pandus.csv", index=False, encoding="utf-8-sig")
コードは以下の記事を参考にしています。
https://note.com/brave_kalmia697/n/nec94245044bc
オリジナルだとnumpy使っていますが、使わなくても書けます。書き直しています。それから、例外処理も追加しています。
あまりピンとこない様子
写経自体はすぐに終わりました。これくらいの分量なら、あっというまに終わってしまうのは、タイピング練習のたまものです。
ただ、できあがったプログラムの動きを見ても、ピンとこない様子でした。残念。
何に使うのかいまいちイメージできていないのだろうと思います。
Dr.STONEの例を出して、「千空がSNSから石化した鳥の情報を集めたのは、おそらくスクレイピングだ」という話をして、通じたのがわずか一人。人に伝えるって難しいのです。
さて、スクレイピングの面白さはHTML・CSSの解析にもあります。おもしろさと書いたものの、初学者にとっては難しさですね。
HTML・CSSの基本部分がわかっていないと、本日作ったスクレイピングコード以上のことはできません。かんたんに説明したものの、また別の機会にやりましょう。