事前準備
requestsでヤフーのトップページにGETリクエストを送ってレスポンスを取得。res変数にhttpレスポンス格納済みです。
import requests url='https://www.yahoo.co.jp' res=requests.get(url)
更に目標とするセレクタをChromeのデベロッパツールを使ってクリップボードにコピーし取得しました。
#topicsfb > div.topicsindex > ul.emphasis
ここまでですね。
今回やること
今回は取得したセレクタを実際にプログラム上で使用して、必要な情報を抜き出すという作業です。
必要なもの
- bs4(BeautifulSoup)
- lxml
Anacondaでパッケージを管理していれば基本的にどちらも初期状態から入っています。
必要なHTMLを抜き出すためにbs4というモジュールを使います。Python用のHTMLパーサもいくつか存在しますが、bs4とlxmlの組み合わせは割とメジャーなのでこれらを使っていきます。
ない場合はどちらもpipでインストール可能です。適宜インストールしてください。
sudo pip install bs4 sudo pip install lxml
ターゲットを抜き出す
from bs4 import BeautiflSoup as bs4 soup = bs4(res.content,'lxml') print(soup.select('#topicsfb > div.topicsindex > ul.emphasis'))
一行目はbs4というモジュールのBeautifulSoupというパーツをインポートして、これ以降 bs4 って書いたらそれを使うってことだからね。という宣言です。as bs4 は別になくても動くんですが、その場合一々BeautifulSoupって書くことになります。
なげーよ。ってことで、bs4と書けば使えるようにしてます。
次は soup という変数に先ほど宣言したbs4を呼び出して、res.contentを渡しています。カンマで区切った後の’lxml’はパーサという解析の方式を指示するのですが、別にこれもなくても動きます。省略可能ですが、lxmlは中身がCで書かれているらしく、標準のhtml.parserより早いってことでこちらを使ってます。
最後の行はsoupオブジェクトのselectメソッドに前回デベロッパツールを使って確保したCSSセレクタを渡しています。
この3行でヤフートップからトピックス抜き出し完了・・・するはずでした。
soup.select('#topicsfb > div.topicsindex > ul.emphasis') Out: []
ふぁ?
Out の中身カラやんけ。( ゚Д゚)
何故か抜き出せていません。
print(soup)
で、全体をさらっと見てみると・・・?
なんか変な文言出てますね。
BOT判定で蹴られてます。
BOT判定というか、直訳すると「ブラウザの情報おかしいから、ちゃんとアップデートしてからアクセスしろよ」的なことをヤフーさんがおっしゃっています。
つまり普段ブラウザからアクセスしてみるヤフーのトップページと、requestsでアクセスして表示されたページ(実際には表示はされてはいないけど)のHTMLが違ったという状態です。
ふぅ、お手上げだぜ・・・。
まとめ
取りたいタグも取れないこんな世の中じゃ~poison
次回、この状況を解決します。
コメント