Python

【初心者でもできる!】PythonでWebスクレイピングする方法を徹底解説!【サンプルあり】

【初心者でもできる!】PythonでWebスクレイピングする方法を徹底解説!【サンプルあり】

こんにちは、さすを(@sasuwo0409)です。

いきなりですが、

Webスクレイピングで業務効率化したい!

Webスクレイピングの副業を始めてみたい!

と思ってはいませんか?

今回の記事は、PythonでWebスクレイピングする方法を解説していきます。

サンプルコードも載せているので、実際に試してみることも可能です。

それでは本文をどうぞ。

困っている人
困っている人

Webスクレイピングを学びたいけど、やり方がわからなくて困ってる。

手順をサンプルコードを見ながら教えて欲しいな。

さすを
さすを

この悩みを解決します!

この記事を読むとわかること:

PythonでWebスクレイピングする方法

筆者の情報:

  • 現役システムエンジニア 兼 ブロガー
  • 過去に6,000万のPython案件を受注
  • 最近ハマっていることは機械学習

※0円のサンプルテキストという近道
独学よりプログラミングスクールの方が効果は出やすいですが、値段が高く、なかなか手を出しづらいですよね。techgymでは無料のサンプルテキストをもらえるので、これを使ってPythonの基礎を学ぶのもありだと思います。

>>techgymの無料サンプルテキストはこちらから

スポンサーリンク

1.Webスクレイピングとは

1.Webスクレイピングとは

Webスクレイピングとは、Webサイトから情報を抽出するコンピュータソフトウェア技術のことです。

少し堅苦しい表現になってしまいましたが、要は「サイトにある必要な情報を取ってくる技術」ということです。

Webスクレイピングをすることで、効率的に大量の情報を集めることができたり、サービス開発に利用することができます。

Webスクレイピングを身に着けると副業ができる

企業が成功するためには情報を手にすることが必要不可欠です。

Webスクレイピングは、欲しい情報を自動でWebサイトから抽出することができるので、とても需要があります。

たとえば、クラウドソーシングで有名なココナラを見てみると、このような案件があります。

図1:Webスクレイピング案件の例
図1:Webスクレイピング案件の例

Webスクレイピングは基本を習得すれば、あとはそれの繰り返しです。なので、月に数万円~十数万円稼ぐことはそう難しくありません。

そのほかの案件を見てみたい方は、以下を参考にしてみてください。

仕事受注に必要なサービス一覧

PythonでWebスクレイピングする際の注意点

Webスクレイピングはすべてのサイトでやってよいとは限りません。

利用規約等で禁止されているサイトもあるので、Webスクレイピングをする前にしっかり確認しましょう。

禁止されているサイトをスクレイピングした場合、アカウントが凍結されたり、捕まる可能性があります。

スクレイピング禁止サイトの代表例:

  • Amazon
  • 楽天市場
  • Twitter
  • Facebook
  • Instagram
  • Yahoo!ファイナンス
  • Wantedly
  • NewsPicks

2.PythonでWebスクレイピングする手順【サンプルあり】

2.PythonでWebスクレイピングする手順【サンプルあり】

今回スクレイピングするWebサイトは「ぽけもん図鑑」です。

上記サイトの画像・番号・名前を自動で取得していきたいと思います。

そして、Webスクレイピングをするときは、以下の手順が必要です。

  1. 画像を格納するフォルダを作成する(画像を取得したい場合)
  2. Webサイトの構造を把握する
  3. プログラムを書いていく

その①:画像を格納するフォルダを作成する

まず初めに、画像を保存するフォルダを作成しましょう。

今回は、プログラムが格納されているGoogle Colabフォルダ直下にimgフォルダを作成しています。
また、imgフォルダの中にpokemonフォルダを作っています。

Google Colab
—–scraping.ipynb(これから作るスクリプト)
—–img
———–pokemon

フォルダ構成を変更してもOKですが、後述するプログラムの保存先フォルダ名が変わるので注意してください。

その②:Webサイトの構造を把握する

Chromeでスクレイピングしたいサイトページを開いて「Ctrl + U」を押すと、サイトのソースコードを見ることができます。

そして、必要な情報がどこに書かれているか探すと、以下の赤枠の部分だということがわかります。

図2:ソースコード概要
図2:ソースコード概要

どのページも同じ作りになっているので、この情報を繰り返し取得できればOKです。

その③: プログラムを書いていく

サイトのソースコードのどの部分を取得すればいいのかがわかったので、プログラムを書いていきます。

今回はGoogle Colaboratory上でプログラムを動かしていきます。

Google Colaboratoryの使い方については「【3分で解決!】Google Colaboratoryの使い方【無料ですぐにPythonを使えます】」で解説しています。

補足:
Google Colaboratoryで作成したフォルダはローカルに落とすことができます。
ソースコードを多少変えれば、ローカル上でももちろんできるので、お好きな方でお試しください。

さすを
さすを

ローカルに落とす方法は後述します!

イッヌ
イッヌ

ローカル環境でPythonが使えて、容量も気にしない人はローカルでやった方が楽だワン!

Webスクレイピングで画像・番号・名前を自動で取得するプログラムは下記の通りです。

#ドライブをマウントする
from google.colab import drive
drive.mount('/content/drive')

補足:
上記のコマンドを実行すると、以下の画面が現れます。手順通りに操作すればOKです。

1.URLを押下

図3:マウントの手順①
図3:マウントの手順①

2.希望のアカウントを選択

図4:マウントの手順②
図4:マウントの手順②

3.ログインを押下

図5:マウントの手順③
図5:マウントの手順③

4.コードをコピーし、「Enter your authorization code」に入力

図6:マウントの手順④
図6:マウントの手順④
#カレントディレクトリに移動
%cd "/content/drive/My Drive/Google Colab"
from bs4 import BeautifulSoup
import urllib.error
import urllib.request
import time
import re
import os

#画像の保存場所
download_dir = 'img/pokemon'

#ユーザーエージェント設定(コピペOK)
ua = 'Mozilla/5.0(Macintosh; Intel Mac Os X 10_12_3)'
'AppleWebKit/537.3.(KHTML,Like Gecko)'
'Chrome/55.0.2883.95 Safari/537.36'

#画像のURLにアクセスして保存する関数
def download_img(url,dst_path):
  try:
    data = urllib.request.urlopen(url).read()
    with open(dst_path,mode='wb') as f:
      f.write(data)

  except urllib.error.URLError as e:
    print("エラーが発生しました。")
    print(e)

#001~898までのリストを作成
number_list = {'{:03}'.format(i) for i in range(1,898)}

#欲しい情報があるURLの取得
url_list = ['https://zukan.pokemon.co.jp/detail/{0}.htm'.format(number) for number in number_list]

#繰り返し処理
for url in url_list:
   time.sleep(0.5)

   #URLのHTMLから画像のURLを取得(Chrome上でCtrl + U した情報)
   req = urllib.request.Request(url,headers = {'User-Agent':ua})
   html = urllib.request.urlopen(req)
   soup = BeautifulSoup(html,"html.parser")
   
   #画像のURLを取得
   images = str(soup.find("meta",property="og:image"))
   target = '"'
   idx = images.find(target)
   images = images[idx+1:]
   box_end = images.index('"')
   images_url = images[0:box_end]

   #ナンバーを取得
   number = str(soup.find("meta",property="og:url"))

   #開始位置
   target = '"'
   idx = number.find(target)
   number = number[idx+1:]
   box_start = number.index('detail/')

   #終了位置
   box_end = number.index('htm')

   number = number[box_start+7:box_end-1]
   
   #名前を取得
   name = str(soup.find("meta",property="og:title"))

   #開始位置
   target = '"'
   idx = name.find(target)
   name = name[idx+1:]

   #終了位置
   box_end = name.index('|')

   name = name[:box_end]

   #保存ファイル名の設定
   dst_path = os.path.join(download_dir + '/' + str(number) + '.png')

   #画像保存
   download_img(images_url,dst_path)

   print(name + "!ゲットだぜっ!")

print("処理が完了しました。")

注意:

  • ユーザーエージェントの設定をしないと情報が取得できないことがあります。
  • Webスクレイピングをすると、一瞬で情報を取得することができますが、サーバーに負荷がかかってしまうことがあるので「time.sleep」を忘れないように入れましょう。

ユーザーエージェント:
ユーザーがどの端末・ブラウザからアクセスしたかなどを示す情報(ソフトウェア)

実行結果:

図7:実行結果①
図7:実行結果①
図8:実行結果②
図8:実行結果②

作成したフォルダをローカルに落とす方法

作成したフォルダをローカルに落としたい場合は、フォルダを右クリックし「ダウンロード」をクリックすればOKです。

さすを
さすを

圧縮形式(.zip)でダウンロードされます!

最後に:めんどうなことは機械に頼もう

Google Colaboratoryを使ってPythonでWebスクレイピングする方法解説してきました。

今回の作業をすべて手作業で行うとしたら数日かかると思いますが、Webスクレイピングをしたら、たった30分でできました。

改めて振り返ると、Webスクレイピングをはじめとした自動化の凄さを痛感しますね。

というわけで、これからもめんどうなことを減らせるようにコツコツとプログラムを書いていこうと思います。

この記事が少しでも役に立っていたらうれしいです!

それでは!


コメント

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