よくAI学習でプログラミング言語 Pythonの話題が出ますよね!でもAIと聞くだけで「難しそう」と・・・
そしてAIとPythonはセットの様な状況になっているので、AIに関わりが無いエンジニアでもPythonは少し取っつき難かったり、
Pythonを使って何をどう活かすのかが想像出来ない状況もあるかもしれないと。
今回、実際に仕事でPythonを利用してWebスクレイピングを使用する機会がありましたので、「こういうのしたかった!」、「聞いた事はあったけど、難しそうでちょっと・・・」という方の参考になればと思いますので、参考にしてみて下さい!
悪魔
まー
Webスクレイピングとは?
WebスクレイピングとはWebページ(HTML)から得たい情報を抽出する事を指します。
例えば、このサイトのこの情報を目視だけじゃなくてリスト化して比較したいなぁなど思った時、そう!Webスクレイピングで出来ちゃうんです!
【注意点】Webスクレイピングを行う際の注意点
っとその前に、Webスクレイピングを行う際、幾つか注意点があります。
まず重要な2点を以下に記載します
- スクレイピングが禁止されているサイト及びページか事前にか確認する事
- 得た情報を変更し商用で使用する際は、勝手に利用せず必ずサイト先へ確認を行い許可を貰った上で行う事
Webスクレイピングを行うという事は、ほぼほぼ第三者が運営しているサイトから情報を取得するという事になります。
第三者が運営しているサイトも「時間やお金、人が動いて」情報を得てサイトを運営しています。
もしサイト規約の方で「禁止」しているサイトであれば、勝手に取得してそのまま流用し公開する事は出来ません。
「禁止」にしていない場合でも、勝手に使用するのは失礼に当たります。どうしてもな場合は必ず連絡を取り、許可を取ってからにしましょう!
このままだと「あれっじゃあWebスクレイピングってアウトー!?」なのと。笑
モラルの問題になりますが、
- 自身の勉強の為に
- 仕事で利用する際は社外には公開しない
- 取得サイトさんのサーバーへ負担を掛ける過度なアクセスはしない
という所を守ればトラブルにはなり難いと思います。
【目的】Webスクレイピングをして何をする??
HTMLページから情報を取得する??で何をするかです。只、単に情報を取得するだけだとあまり意味が無いと思うんです。
例えば、
- この商品が欲しいけど仕様や材料、価格を比較したいなと思ったけど目視だと情報量が多く比較し難いな
- 仕事で分析業務をしているが、自社製品との比較材料として纏まった情報が欲しいな
- 顧客からの自社サービス、製品の評価ってどうなんだろう?(レビューページ)
など。
Webスクレイピングは特に 、
- 情報収集
- 分析
に向いています!
目視で情報収集を行うとなると、データ量が多くなるととてつもない時間が掛かってしまい効率が悪いですが、
プログラミング言語のPythonを利用してWebスクレイピングを行えば、プログラムが勝手に指定した情報を取得してくれます!
目的・結果までの道のりが早く得られるんですよね!
悪魔
まー
PythonでWebスクレイピングを行う方法
今回、私が試した方法はライブラリを使った方法になります!
PythonにはWebスクレイピングを行う為のライブラリが幾つかあります。ライブラリは効率良くプログラミングを行う為の部品の集合体と思って下さい!
このライブライを利用する事で、比較的簡単にWebスクレイピングを行う事が出来るんですよね!
今回はBeautiful Soupというライブラリを使った方法をご紹介します!
ライブラリ、Beautiful Soupを使ってスクレイピングを行う方法
単一ページ、ページを跨がない場合の方法
先に全体のコードを掲載します!一先ず眺めてみて下さい!
今回、Webページから
- 商品タイトル
- 価格
を取得して、CSVファイルに吐き出すという構成になっています!
下記コードの大まかな流れは以下になります。
- スクレイピングを行う為のライブラリを読み込む
- 取得先URLからWebページ情報(HTML)を取得
- 取得したい部分のHTMLを解析して文字のみを取得
- 取得した情報を配列に保持
- 保持していた配列をCSVに書き込み
import requests import BeautifulSoup res = requests.get('https://www.maxs-hardware.com/') res.raise_for_status() soup = BeautifulSoup(res.content, "html.parser") elems = soup.select('.sec-product-base') l=[] for item in elems: d = {} product_name = item.find('h2').text d["ProductName"] = product_name producr_price = item.find("p",{"class","product-price"}).text d["ProductPrice"] = product_price l.append(d) import pandas df = pandas.DataFrame(l) df.to_csv("C:\output\Output.csv")
1.スクレイピングを行う為のライブラリを読み込む
import requests import BeautifulSoup
import requestsは今回行うスクレイピングのWebページ情報を取得するという部分のライブラリ
import BeautifulSoupはスクレイピングを行う際に便利な部品が纏められているライブラリ
この二つのライブラリはスクレイピングを行う際の呪文みたいなモノと思っておいて下さい、.pyファイルを新規新規作成した際はこの二つのライブラリをimportして読み込んで下さい!
2.取得先URLからWebページ情報(HTML)を取得
res = requests.get('https://www.maxs-hardware.com/') res.raise_for_status() soup = BeautifulSoup(res.content, "html.parser") elems = soup.select('.sec-product-base')
import requestsでrequestsライブラリが使用出来る状態になりましたので、
1行目のrequests.get(‘https://www.maxs-hardware.com/’)で取得したいWebサイトURLを指定して、情報を取得します。
2行目のres.raise_for_status()で取得したいWebサイトURLが正常かどうかチェックしています。
指定したURLが間違っていたり(存在しないページ)場合、存在しないページの取得は出来ないのでエラーを返して、この部分で処理がストップする様になっています。
3行目のsoup = BeautifulSoup(res.content, “html.parser”)で1行目で取得したWebサイト情報(HTML)をpythonのプログラムで扱える状態に変換します。
4行目のelems = soup.select(‘.sec-product-base’)は、HTMLページにあるsec-product-base(クラス名)の物を全て取得するというコードです。
今回、sec-product-base(クラス名)のタグの中に、商品名と価格が入っている為、この部分を全て取得します。
3.取得したい部分のHTMLを解析して文字のみを取得し構造体に格納
l=[] for item in elems: d = {} product_name = item.find('h2').text d["ProductName"] = product_name producr_price = item.find("p",{"class","product-price"}).text d["ProductPrice"] = product_price
まず、全体の構成として配列と構造体について説明します!CSVに吐き出す上で重要なポイントになりますので、頑張って説明します。笑
1行目にあるl=[]が配列。
4行目にあるd = {}が構造体になります。
配列と構造体をネットショッピングでボールペンをダース買いした際の送られてくる状態で表したいと思います。笑
この場合、
一つの段ボールにダース(箱)が纏めて入っていて、ダース(箱)の中にボールペンが入っている状態かと思います。
これを上記コードに当てはめると、
配列:ダース(箱)が纏めて入っている一番外側の段ボール
構造体:ダース(箱)
というイメージになります。
実際のデータ構造で書くとこんな感じで、
[{‘商品A’,’1,000′},
{‘商品B’,’2,000′}
{‘商品C’,’3,000′}
]
何となく、イメージを掴んで貰えた?かと思います。
5行目のproduct_name = item.find(‘h2’).textが商品名に当たります。
6行目では5行目で取得した商品名をProductNameという構造体に格納しています。
8行目のproducr_price = item.find(“p”,{“class”,”product-price”}).textが価格に当たります。
9行目では7行目で取得した価格をProductPriceという構造体に格納しています。
4.取得した情報を配列に保持
l=[] for item in elems: d = {} product_name = item.find('h2').text d["ProductName"] = product_name producr_price = item.find("p",{"class","product-price"}).text d["ProductPrice"] = product_price l.append(d)
3の取得したい部分のHTMLを解析して文字のみを取得し構造体に格納では構造体に商品名と価格を格納しました。
まだ、このままでは構造体のままで配列には格納されていませんので、配列に格納します。
11行目のl.append(d)で配列に格納しますが、append(d)のdの部分が構造体に当たります。
この状態でようやく、構造体が配列に格納される事になります!
5.保持していた配列をCSVに書き込み
import pandas df = pandas.DataFrame(l) df.to_csv("C:\output\Output.csv")
CSVを吐き出す為、pandasというライブラリを使用します。
このライブラリはデータ構造(配列や構造体)をCSVやテキストファイル、Excelなどのフォーマットに変換するライブラリになります。
2行目の df = pandas.DataFrame(l)で、「4.取得した情報を配列に保持」で使用した配列を指定。
3行目df.to_csv(“C:\output\Output.csv”)でCSVを吐き出す先を指定しています。