【python】Webスクレイピングをやってみる。

python

こんばんは。ヤマモトです。

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>]

いえーい。成功。


いやーもう少し手こずるかなあ、と思っていたが、
意外と簡単にできた。

もうちょっと頑張ればジャンプのナンバリング情報や、画像も自動でダウンロードできそう。

次回はその辺をやってみようかな。

コメント

タイトルとURLをコピーしました