python+bs4でスクレイピング
python3.7+BeautifulSoup4を使ったスクレイピングの基本をお勉強します。
参考サイト:http://kondou.com/BS4/
導入
$ pip install beautifulsoup4 # BeautifulSoup4のインストール
$ pip install lxml # htmlパーサーのインストール
htmlオブジェクトの用意
htmlDocument = "<html><body><p>hoge</p></body></html>"
htmlDocument = """ #複数行なら
<html>
<body>
<p>
hoge
</p>
</body>
</html>
"""
ウェブサイトをhtmlとして取得する
$ pip install requests # httpリクエストをやり取りできるやつ
import requests
get = requests("ほしいサイトのURL")
htmlDocument = get.text # html全文を取得
status = get.status_code # ステータスコードを取得(200なら成功)
成否判定にステータスコードよく使うのでメモ。
404用のhtmlが用意してあったり、自動遷移が入ってるサイトだと404の時にうまくエラーコードが取れないっぽい?(404だよーってページのhtmlがちゃんと取れて200が返ってくる場合がある)
スープを作る
from bs4 import BeautifulSoup
import lxml
soup = BeautifulSoup(htmlDocument,"lxml") # これで解析できる
soup = BeautifulSoup(open("index.html"),"lxml") # ファイルを渡してもいい
ぐつぐつ。
要素にアクセスする
p = soup.p # soup内の最初のp要素を取得する・戻り値はlist
hoge = soup.a["class"] # soup内の最初のa要素に指定されているクラス名を取得する
ダメな例:
p = soup.p
NG = p.span
# soup.pの戻り値がtagオブジェクトじゃなくてlistなので、2行目でエラーになる
全ての要素を取得する
pList = soup.select("p") # すべてのp要素
divList1 = soup.select(".hoge") # すべてのhogeクラスを持つ要素
divList2 = soup.select(".hoge.fuga") # すべての、hoge、fuga両方のクラスを持つ要素
divList3 = soup.select("#nya") # IDがnyaの要素/IDで取得したいときはシャープを使う
要素内の本文を取得する
string = soup.select("p").string # <p>hoge</p>のhogeが取れる
ある要素配下のある要素
divList = soup.select("#nya .hoge") # IDがnyaの要素の配下のhogeクラスを持つ要素
# 半角スペースでつなげる
n番目の要素
divList = soup.select("#nya .hoge:nth-of-type(1) p) # 1番目のhogeクラスを持つ要素の配下のp
# (nth-of-typeの記法はCSSと同じで1始まり)
ユーザーエージェントを指定する
参考:Pythonでスマホ用のページのwebスクレイピングを試してみる
ヘッダーにユーザーエージェント情報を入れる。かんたん。
この記事が気に入ったらサポートをしてみませんか?