こんばんは。ヤマモトです。
8月ももう終わりっすね。上期も終わりが近づいてきて、終了報告をまとめる作業が増えてきて、仕事がちょっと億劫気味。。。
めんどくさいな~~~
ということで、気分転換もかねて先日のpythonでwebスクレイピング作業の続きをやっていこうと思う。
先日の作業はこちらから。
※ 注意 ※
対象のWebサイトによってはスクレイピングを禁止していることがあります。著作権には重々注意してください。
今回はあくまで情報収集および分析目的で行っています。
モジュールの用意
先日、Anacondaでpython環境を整えるところまでやったが、webスクレイピングに必要なモジュールまではインストールしていなかったので、まずはそこから。
必要なモジュール
使うモジュールは以下の二つ。
(参考: 図解!PythonでWEB スクレイピングを極めよう!(サンプルコード付きチュートリアル) )
- Requests
- HTMLを取ってくるモジュール
- Beautiful Soup
- とってきたHTMLから必要なデータを抽出する
モジュールのインストール
先日作った仮想環境をactivateして、その環境にインストールしていく。
(base) C:\Users\ヤマモト>activate py310
(py310) C:\Users\ヤマモト>conda install requests
(py310) C:\Users\ヤマモト>conda install beautifulsoup4
モジュールのインストールが完了したら、実際にimportできるかを試す。
pythonをプロンプトから起動してもいいが、jupyter labのバッチを作ったので、早々と起動してipynbを作って試してみる。
import requests
from bs4 import BeautifulSoup
うむ。問題なさそう。
コーディングしてみる
HTMLの取得
requestsモジュールを使って、ジャンプの連載一覧(https://www.shonenjump.com/j/rensai/)のHTMLを取得してみる。
# ジャンプのサイトからHTMLを取ってくる。
url = 'https://www.shonenjump.com/j/rensai/'
res = requests.get(url,timeout=3)
# 文字コードを推定して適宜変換する関数を使用。
res.encoding = res.apparent_encoding
# 試しに表示
res.text[:500]
'<!DOCTYPE html>\n<html>\n<head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# article: http://ogp.me/ns/article#">\n<meta charset="UTF-8">\n<title>連載中の作品一覧|集英社『週刊少年ジャンプ』公式サイト</title>\n\t\n<!-- Google Tag Manager -->\n<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({\'gtm.start\':\nnew Date().getTime(),event:\'gtm.js\'});var f=d.getElementsByTagName(s)[0],\nj=d.createElement(s),dl=l!=\'dataLayer\'?\'&l=\'+l:\'\';j.async=true;j.src=\n\'https://www.googletagmanager.com/gtm.js?id=\'+i+dl;f.parentNode.insertBe'
おおおおおおおお
良い感じに取得できてそう。
一瞬、日本語が取得できなくて焦ったが、.apparent_encoding
をかませたら上手くいった。
一応、通信結果も確認。
# 一応、正常にHTTP通信ができていたかを確認。
res.status_code
200 # 正常
今後バッチ化とかする際に、200以外だったらエラー処理を入れるのに使えそう。
HTMLから連載一覧を抽出
さて、こっからが割と腕の見せ所。
とりあえず、BeautifulSoupにデータを渡して、HTMLを見やすくする。
# html.parserに渡してHTMLの解析を行う。
soup = BeautifulSoup(res.text, "html.parser")
# 前回確認したときに、divタグに連載一覧がありそうだったので、divを指定。
elems = soup.find_all("div")
中身を見てみる。
[<div id="returnTop">
<img src="/j/common/img/returnTop.png"/>
</div>,
<div class="tickerWrap">
<div class="ticker" id="ticker">
<ul>
<li><a href="/j/weeklyshonenjump/">週刊少年ジャンプ39号、好評発売中!</a></li>
<li><a href="/j/comics/">9月2日(金)発売のジャンプコミックス情報を更新!</a></li>
<!--<a href="http://heroaca-stage.com/" target="_blank"> ページ移動-->
### 途中省略 ###
</div>,
<div class="sakkaName">『ONE PIECE』尾田栄一郎</div>,
<div class="sakkaName">『HUNTER×HUNTER』冨樫義博</div>,
<div class="sakkaName">『僕のヒーローアカデミア』堀越耕平</div>,
<div class="sakkaName">『ブラッククローバー』田畠裕基</div>,
<div class="sakkaName">『呪術廻戦』芥見下々</div>,
<div class="sakkaName">『夜桜さんちの大作戦』権平ひつじ</div>,
<div class="sakkaName">『アンデッドアンラック』戸塚慶文</div>,
<div class="sakkaName">『マッシュル-MASHLE-』甲本一</div>,
<div class="sakkaName">『僕とロボコ』宮崎周平</div>,
<div class="sakkaName">『高校生家族』仲間りょう</div>,
<div class="sakkaName">『SAKAMOTO DAYS』鈴木祐斗</div>,
<div class="sakkaName">『逃げ上手の若君』松井優征</div>,
<div class="sakkaName">『ウィッチウォッチ』篠原健太</div>,
<div class="sakkaName">『アオのハコ』三浦糀</div>,
<div class="sakkaName">『PPPPPP』マポロ3号</div>,
<div class="sakkaName">『ドロンドロロン』大須賀玄</div>,
<div class="sakkaName">『あかね噺』原作:末永裕樹 作画:馬上鷹将</div>,
<div class="sakkaName">『地球の子』神海英雄</div>,
<div class="sakkaName">『すごいスマホ』冨澤浩気・肥田野健太郎</div>,
<div class="sakkaName">『ALIENS AREA』那波歩才</div>,
<div class="sakkaName">『ルリドラゴン』眞藤雅興</div>,
<div class="serialSeries-btn"><a href="/j/rensai/archives.html">連載作品アーカイブス</a></div>,
### 以降省略 ###
欲しい情報ミッケ!!!
あとはここから共通で引っ張ってこれそうなキーワードを探すわけだが、、、
都合が良いことに、class="sakkaName"
が共通してそう。
これを指定して抜いてみる。
elems = soup.find_all(class_="sakkaName")
elems
[<div class="sakkaName">『ONE PIECE』尾田栄一郎</div>,
<div class="sakkaName">『HUNTER×HUNTER』冨樫義博</div>,
<div class="sakkaName">『僕のヒーローアカデミア』堀越耕平</div>,
<div class="sakkaName">『ブラッククローバー』田畠裕基</div>,
<div class="sakkaName">『呪術廻戦』芥見下々</div>,
<div class="sakkaName">『夜桜さんちの大作戦』権平ひつじ</div>,
<div class="sakkaName">『アンデッドアンラック』戸塚慶文</div>,
<div class="sakkaName">『マッシュル-MASHLE-』甲本一</div>,
<div class="sakkaName">『僕とロボコ』宮崎周平</div>,
<div class="sakkaName">『高校生家族』仲間りょう</div>,
<div class="sakkaName">『SAKAMOTO DAYS』鈴木祐斗</div>,
<div class="sakkaName">『逃げ上手の若君』松井優征</div>,
<div class="sakkaName">『ウィッチウォッチ』篠原健太</div>,
<div class="sakkaName">『アオのハコ』三浦糀</div>,
<div class="sakkaName">『PPPPPP』マポロ3号</div>,
<div class="sakkaName">『ドロンドロロン』大須賀玄</div>,
<div class="sakkaName">『あかね噺』原作:末永裕樹 作画:馬上鷹将</div>,
<div class="sakkaName">『地球の子』神海英雄</div>,
<div class="sakkaName">『すごいスマホ』冨澤浩気・肥田野健太郎</div>,
<div class="sakkaName">『ALIENS AREA』那波歩才</div>,
<div class="sakkaName">『ルリドラゴン』眞藤雅興</div>]
いえーい。成功。
いやーもう少し手こずるかなあ、と思っていたが、
意外と簡単にできた。
もうちょっと頑張ればジャンプのナンバリング情報や、画像も自動でダウンロードできそう。
次回はその辺をやってみようかな。
コメント