
事前準備
requestsでヤフーのトップページにGETリクエストを送ってレスポンスを取得。res変数にhttpレスポンス格納済みです。
0 1 2 3 4 5 | import requests url='https://www.yahoo.co.jp' res=requests.get(url) |
更に目標とするセレクタをChromeのデベロッパツールを使ってクリップボードにコピーし取得しました。
0 1 2 | #topicsfb > div.topicsindex > ul.emphasis |
ここまでですね。
今回やること
今回は取得したセレクタを実際にプログラム上で使用して、必要な情報を抜き出すという作業です。
必要なもの
- bs4(BeautifulSoup)
- lxml
Anacondaでパッケージを管理していれば基本的にどちらも初期状態から入っています。
必要なHTMLを抜き出すためにbs4というモジュールを使います。Python用のHTMLパーサもいくつか存在しますが、bs4とlxmlの組み合わせは割とメジャーなのでこれらを使っていきます。
ない場合はどちらもpipでインストール可能です。適宜インストールしてください。
0 1 2 3 | sudo pip install bs4 sudo pip install lxml |
ターゲットを抜き出す
0 1 2 3 4 5 | 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行でヤフートップからトピックス抜き出し完了・・・するはずでした。
0 1 2 3 | soup.select('#topicsfb > div.topicsindex > ul.emphasis') Out: [] |
ふぁ?
Out の中身カラやんけ。( ゚Д゚)
何故か抜き出せていません。
0 1 2 | print(soup) |
で、全体をさらっと見てみると・・・?

なんか変な文言出てますね。
BOT判定で蹴られてます。
BOT判定というか、直訳すると「ブラウザの情報おかしいから、ちゃんとアップデートしてからアクセスしろよ」的なことをヤフーさんがおっしゃっています。
つまり普段ブラウザからアクセスしてみるヤフーのトップページと、requestsでアクセスして表示されたページ(実際には表示はされてはいないけど)のHTMLが違ったという状態です。
ふぅ、お手上げだぜ・・・。
まとめ
取りたいタグも取れないこんな世の中じゃ~poison
次回、この状況を解決します。
次の記事
スクレイピング対策をしているサイトで、requestsから正常にアクセスして、普段人間が見ている画面と同じHTMLを返させる方法