Web スクレイピングとはWeb サイトの情報を取得して、その中から必要な情報を取り出す技術を指します。今回はニコニコ静画の漫画ぺージにある赤枠で囲んでいる公式マンガの情報をスクレイピングしていきます。
プログラムの出力結果がこちら。ここでは雑誌のタイトルと雑誌ページのURLを取得しています。ずらりと並んだ雑誌の数は132誌。多いです。
1.ホームページの情報を取得する
最初にHTMLにリクエストできるpythonライブラリのrequestsを使ってホームページの情報(HTML)を取得します。requestsをimportしてURLから情報を取得します。
import requests url = "https://seiga.nicovideo.jp/manga/?track=global_navi_top" res = requests.get(url) print(res)
このコードを実行するとResponse[200]という返事が返ってきました。
このデータをHTMLで返してくれるようにbeautifulsoupで指示します。
import requests from bs4 import BeautifulSoup url = "https://seiga.nicovideo.jp/manga/?track=global_navi_top" res = requests.get(url) soup = BeautifulSoup(res.text,"html.parser") print(soup)
コードを実行するとHTMLデータが返ってきました。
2.データの中から必要な情報を取得する
取得したニコニコ静画のWebデータから公式マンガの情報をselect関数で抽出します。抽出された情報はlist型なのでfor文を使って切り分けます。
import requests from bs4 import BeautifulSoup url = "https://seiga.nicovideo.jp/manga/?track=global_navi_top" res = requests.get(url) soup = BeautifulSoup(res.text,"html.parser") mg_list = soup.select(".mg_banner") for mg_info in mg_list: print(mg_info,"\n")
これを実行すると、
上段の画像の赤枠のHTMLが取得できます。
3.取得した情報から欲しい部分を抽出する
今回欲しい情報は雑誌のタイトルとURLなので、取得したimgタグの中にあるtitle属性の値を抽出します。上で書いたコードの最後の部分を、
for mg_info in mg_list: print(mg_info,"\n")
から、
for mg_info in mg_list: print(mg_info,img.get("title")"\n")
に変えるだけです。これを実行すると、
imgタグのtitle属性に入っている雑誌のタイトルを抽出できました。同様にURLも抽出したいのですが、URLは参照しているdivタグの親のaタグに入っています。
こういった場合の対応策もbeatifulsoupには用意されています。parent関数で参照先にaタグを指定できます。
for mg_info in mg_list: print(mg_info,img.get("title")"\n")
を、
https = "https://seiga.nicovideo.jp" for mg_info in mg_list: print(mg_info.img.get("title"),end = " ") print(https + mg_info.parent.get("href"))
へ書き換えて実行すると、
雑誌のタイトルとURLを抽出することができました。
コード
import requests from bs4 import BeautifulSoup url = "https://seiga.nicovideo.jp/manga/?track=global_navi_top" https = "https://seiga.nicovideo.jp" res = requests.get(url) soup = BeautifulSoup(res.text,"html.parser") mg_list = soup.select(".mg_banner") for mg_info in mg_list: print(mg_info.img.get("title"),end = " ") print(https + mg_info.parent.get("href"))