時代にかなり乗り遅れてるテーマだけど
今更ながらPython(パイソン)に触れてみる!スクレイピングに挑戦です!!
これが意外と少ないコードで実現できたんですよ。。。感動
コーディングのルールやライブラリが掴めてくると、
あっという間に自分の欲しい情報を自動で取得できるようなプログラムが作れそうです!
いきなりサンプルコードをお見せします
今回は、私が車好きというだけの理由で
カーセ○サーさんのサイトから車の情報を取得するスクレイピングコードを作ってみました
やりたい事はざっとこんな感じ
- メーカー一覧を取得
- メーカーにぶら下がる車種一覧を取得
- 車種にぶら下がるグレード一覧を取得
一旦はこんなレベルで良いかな。本当はもっと欲しいけど
で、上記のやりたい事を実現できたソースがこちら↓
# carsensorから車種情報を取得する
import re
import requests
from bs4 import BeautifulSoup
# carsensorのホストURLを定義しておく
host = "https://www.carsensor.net"
# まずはメーカー一覧を取得
r = requests.get(host + "/catalog/search/#GER")
soup = BeautifulSoup(r.content, "html.parser")
# ブランド名とURLを取得
links = [{'bland': url.next.text, 'url': url.get(
'href')} for url in soup.select('div.country_wrap a')]
makers = [item for item in links if re.match("^/catalog/.+", item['url'])]
for maker in makers:
# メーカー毎に車種一覧を取得
r2 = requests.get(host + maker['url'])
soup2 = BeautifulSoup(r2.content, "html.parser")
# 車種とリンクを同時に取得
carsLinks = [{'name': url.text, 'url': url.get('href')}
for url in soup2.select('p.shashuListItem__shashu a')]
# 車種の詳細情報を取得する
for detail in carsLinks:
r3 = requests.get(host + detail['url'])
soup3 = BeautifulSoup(r3.content, "html.parser")
# 車種のグレード一覧を取得する
grades = [label.text for label in soup3.select(
'th.js_grade_name label') if label.text != '']
for grade in grades:
print(maker['bland'] + ' - ' + detail['name'] + ' - ' + grade)
関数化してないからちょっとグダグダに見えるけど。。。初心者だから。。。さw
使用しているライブラリ
さらっと、使ったライブラリのご紹介(深く理解してないからその辺ご了承下さいw)
re
これはPythonの標準ライブラリらしく、何もinstallしないで使えた。
正規表現でURLに特定の文字列を含むか判定する為にimportしたライブラリっすね。
re.match("^/catalog/.+", item['url'])
re.match(‘正規表現’, 検査対象) こんな感じで使います。
Requests
同期処理でhttpリクエストを発行するライブラリっす。
これを使うためにはインストールが必要です!
$ pip install requests
これだけでOK!
Requestsは同期処理なので、沢山のリクエストをドカッと実行したい場合には不向きっす。
今回は順々に情報を取得していく処理にしているので、同期で良いやって感じで使ってます。
r = request.get('URL')
これでHTMLが返ってくるっぽいんで、パースして操作できるようにします。
BeautifulSoupに続く
BeautifulSoup
こやつもインストールが必要っす。
$ pip install beautifulsoup4
これでOK!早速使います!w
soup = BeautifulSoup(r.content, "html.parser")
r.contentってのがHTMLっすね。他にもヘッダ情報なんかも取得できるみたいですが、
今回やりたいことには関係ないので、スルーしてます。
soupという変数にパースされたHTMLが入ってるので、
この中から欲しい情報を引っこ抜きます。
soup.select('div.hogehoge')
この記述でCSSセレクタっぽい事ができます。
上の例だとdivタグのclassがhogehogeの要素が取得できます。
こんな具合で自分の欲しい情報を抜き出していきます。
いくらでも応用できる!
こんなざっくりな理解でも 「メーカー – 車種名 – グレード」 という情報を
リストで出力できるようになりました。
基礎知識はまだまだ足りないと思いますが、
にわか知識でこれだけ形にできるという事は、かなり取っつき易いのではないでしょうか?
最初に形にするまでが結構苦労する言語学習に於いて
この簡易さはメリット大だと思います
これを読んだあなたはもうPythonスタートできますよ!