個人業務用アシスタント作成#2。Yahoo ニュースのヘッドラインクローリング
前文で上のコードを使ってyahooのニュースのヘッドラインを持って来させました。 この程度のコードは簡単に書い,理解される方も多いと思いますが,もしやウェブ クローリングが初めての人のために(私がそうだったので) 1行ずつ説明をしてみようと思います。
- import requests
- from bs4 import BeautifulSoup as bs
importは設置されたライブラリーをpython環境から持ってきて使用するという宣言です。 ここではまず,ウェブと情報を取り交わすためにrequestsのライブラリーをもたらし,このように持ってきた情報をparsing(構文解析)するためにBeautifulSoupのライブラリーを持ってきました。
この時,BeautifulSoupライブラリーはbs4というパッケージの中にあるものなので,まずfrom bs4にパッケージを読み込み,その中のBeautifulSoupを持ってきました。 そしてこれが長すぎるので,今後これをbsと指称(as bs)することにしました。
- url = ‘https://news.yahoo.co.jp/’
- news = requests.get(url)
- html = news.text
- soup = bs(html, 'lxml’)
1番行はYahooニュースのウェブページをurlという変数に指定したものです。
2番行はrequestsの下位機能である,getを利用してウェブの情報を取得します。 このとき持ってくる対象の住所は,1番行で定義したurlになるのです。 もちろんここにurl変数以外のhttpアドレスを入力しても良いのですが,変数を使用するのがシンプルなのでこのように処理しました。 そして,このようにして持ってきた情報をnewsという変数に指定します。
3番行は,news変数からテキストのみを抽出(.text)し,これをhtmlという変数に指定します。
4番行はbsでparsingします。 構造はbs(parsing 対象,parsing 方式)です。 つまり,3列のhtml変数をparsingし,その方式はlxmlという意味です。 こうやってparsingした情報をsoupという変数にします。https://news.yahoo.co.jp/こうしてsoupの情報をみると(print(soup)を利用)ページのhtml(タグ)が全て入っていることを確認することができます。
こうしてsoupの情報をみると(print(soup)を利用)ページのhttml(タグ)が全て入っていることを確認することができます。
- headline_title =
- headline_url =
これは,あらかじめ出力する情報の空いている欄を作ってあげるものです。 状況によって情報が変わるはずなのでリストの形態で作りました。 headline_titleは題名を,headline_urlは該当記事のアドレスになります。
その下は記事の情報を抽出する部分です。 このときメインヘッドライン(写真のある記事)と残りのヘッドラインで分けることができます。 注意すべきは写真のあるヘッドラインはタイトルに"写真"という言葉が後に追加されるためこれを消さなければなりません。 まず,メインヘッドラインを抽出し,"写真"という単語を取り除きます。
- news_head = soup.select('#epTabTop > ul.topics > li.topTpi > div > h1 > a')
- headline_title.append(news_head[0].text.replace("写真",""))
- headline_url.append(news_head[0].get('href'))
1つの行は,bsのselectを利用してCSSセレクタに該当する情報を取得します。 soupという変数がもっている情報の中から.selectを利用して選択するが,その選択対象が()の中にあるCSSセレクターという意味です。
二行目はこのように選択した情報の中からテキストだけを持ってきて(.text)"写真"という単語を何もないものにするということです(.replace("バイブの単語","交換したい単語"))
三番目の行は,セレクタで選択した情報の中からhref タグを持ってくるものです。
CSSセレクタが少し難しいと思いますがクロム開発ツールを利用すれば容易です。 クロム開発ツールで左上のアイコンをクリックし,CSSを希望する領域にカーソルを持っていくとハイライトになり,その位置でクリックすると該当領域のhttmlに位置します。 この状態でウクリック > Copy > Copy Selectorを押すとCSSセレクターがコピーされます。 これを上の<CSS Selector>に貼り付ければいいです。
下は同じような行動を繰り返すようにfor文を使って繰り返しさせました。 CSSセレクタの位置は異なりますが,構造は上と同じです。
こうしてheadline_titleとheadline_urlを出力するようにprint命令を実行させました。