##使用するライブラリ
Requests
Requestsは、 Python の HTTP 通信ライブラリです。 Requests を使うとWebサイトの情報取得や画像の収集などを簡単に行うことができます。
Beautiful Soup
HTML や XML から狙ったデータを抽出するためのライブラリです。
公式ドキュメントの冒頭の説明を見るとこれは HTML や XML のパーサーそのものではなく、パーサーをラップして扱いやすくするライブラリのようです。
##データの格納
まずrequestsをインポート
欲しいURLを取得する
import requests
def get_rakuten():
url = "https://search.rakuten.co.jp/search/mall/pythonチュートリアル/"
responce = requests.get(url)
print(responce)
get_rakuten()
実行結果
HTTPステータスコードは、HTTPにおいてWebサーバからのレスポンスの意味を表現する3桁の数字からなるコード
200の場合、リクエストは成功し、レスポンスとともに要求に応じた情報が返される。
今回の場合取得したいデータがresponceに格納できたことを示す。
<Response [200]>
##取得したいページのhtmlを取得
.textとするとhtmlの情報が取得できる
import requests
def get_rakuten():
url = "https://search.rakuten.co.jp/search/mall/pythonチュートリアル/"
responce = requests.get(url)
print(responce.text)
get_rakuten()
実行結果の一部
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script> window.__INITIAL_STATE__ = {};
window.__REWIRED_SCHEMAS__ = ["pc"];</script>
<title data-duiid="7q54vmlfe">【楽天市場】pythonチュートリアルの通販</title><meta name="description" content="楽天市場-「pythonチュートリアル」22件 人気の商品を価格比較・ランキング・レビュー・口コミで検討できます。ご購入でポイント取得がお得。セール商品・送料無料商品も多数。「あす楽」なら翌日お届けも可能です。"/><meta name="keywords" content="pythonチュートリアル,通販,インターネット,ショッピング,楽天市場"/><meta name="robots" content="noodp"/><meta property="og:image" content="https://r.r10s.jp/com/img/logo/rakuten_group_red.svg"/><meta property="dui:trace" content="b9cb1ccc-0db5-4869-b005-516a67cf13c0"/><link rel="canonical" href="https://search.rakuten.co.jp/search/mall/python%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB/"/><link rel="alternate" href="android-app://jp.co.rakuten.android/rakuten-ichiba-app/www.rakuten.co.jp/search?source=appindexing_search&genreId=0&keyword=python%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB"/><link rel="icon" href="https://www.rakuten.co.jp/favicon.ico"/>
<script type="text/javascript" src="https://r.r10s.jp/com/js/d/shisa/shisa-1.0.2.min.js" id="script-shisa"
data-group="ichiba-search"></script>
.textで取得したhtml情報を解析する
その際 BeautifulSoupを使用する
import requests
from bs4 import BeautifulSoup
def get_rakuten():
url = "https://search.rakuten.co.jp/search/mall/pythonチュートリアル/"
responce = requests.get(url)
html = responce.text
soup = BeautifulSoup(html, "html.parser")
print(soup)
get_rakuten()
実行結果の一部
divクラスが整理されているのがわかる
</div>
<div class="item">
<div class="dui-container conditionfilter open" data-duiid="cif84ng3s"><div class="dui-filter-menu"><div class="header" title="コンディション"><span>コンディション</span></div><div class="content"><div class="dui-list"><a class="item" href="https://search.rakuten.co.jp/search/mall/python%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB/?used=0">新品</a><a class="item" href="https://search.rakuten.co.jp/search/mall/python%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB/?used=1">中古品</a><a class="item" href="https://search.rakuten.co.jp/search/mall/python%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB/-/tg5002023/">レンタル</a></div></div></div></div>
</div>
###URLから商品タイトルを取得
デベロッパーツールで確認するとtitleタグに商品名があったので.selectで取得したいタグを指定
.selectではtitleとして見つかった複数のものがリスト型で出力されるのでfor文で回す
import requests
from bs4 import BeautifulSoup
def get_rakuten():
url = "https://search.rakuten.co.jp/search/mall/pythonチュートリアル/"
responce = requests.get(url)
html = responce.text
soup = BeautifulSoup(html, "html.parser")
titles = soup.select(".title")
for title in titles:
print(title.text)
get_rakuten()
出力結果の一部
中古 【中古】 Excel 2010 & SQL Server 2008 R2による企業データ分 PDCAサイクルに沿った最新BIの実 / / [単行本(ソフトカバー)]【ネコポス発送】
中古 【中古】 Vocaloidをたのしもう vol.2 / ヤマハミュージックメディア / ヤマハミュージックメディア [ムック]【ネコポス発送】
中古 【中古】 mule/viスーパーリファレンス / 伊藤 真人, 田谷 文彦, 小巻 賢二郎, 前田 雄一郎 / ソフトバンククリエイティブ [単行本]【ネコポス発送】
お届け先で設定された都道府県(離島除く)への最も安い配送方法での送料が各商品に表示されます。
翌日配送(あす楽)対応あり
楽天プレミアム特典あり
###余分な空白が出力されたので除去
.searchresultitemの変数をリスト型で格納し、その中でtitleを一つ一つ出力していく
select_oneとすれば見つかった最初の情報のみが保持されるためリスト型にはならない
import requests
from bs4 import BeautifulSoup
def get_rakuten():
url = "https://search.rakuten.co.jp/search/mall/pythonチュートリアル/"
responce = requests.get(url)
html = responce.text
soup = BeautifulSoup(html, "html.parser")
items = soup.select(".searchresultitem")
for item in items:
title = item.select_one(".title")
print(title.text)
get_rakuten()
実行結果の一部
空白が消えていることがわかる
中古 【中古】 mule/viスーパーリファレンス / 伊藤 真人, 田谷 文彦, 小巻 賢二郎, 前田 雄一郎 / ソフトバンククリエイティブ [単行本]【宅配便出荷】
中古 【中古】 Excel 2010 & SQL Server 2008 R2による企業データ分 PDCAサイクルに沿った最新BIの実 / / [単行本(ソフトカバー)]【ネコポス発送】
中古 【中古】 Vocaloidをたのしもう vol.2 / ヤマハミュージックメディア / ヤマハミュージックメディア [ムック]【ネコポス発送】
中古 【中古】 mule/viスーパーリファレンス / 伊藤 真人, 田谷 文彦, 小巻 賢二郎, 前田 雄一郎 / ソフトバンククリエイティブ [単行本]【ネコポス発送】
###価格を表示
価格はimportantセレクタに記載されているため
select_oneで取得できる
import requests
from bs4 import BeautifulSoup
def get_rakuten():
url = "https://search.rakuten.co.jp/search/mall/pythonチュートリアル/"
responce = requests.get(url)
html = responce.text
soup = BeautifulSoup(html, "html.parser")
items = soup.select(".searchresultitem")
for item in items:
title = item.select_one(".title")
print(title.text)
price = item.select_one(".important")
print(price.text)
get_rakuten()
実行結果の一部
Pythonチュートリアル第3版 Python 3.5対応 [ グイド・ファン・ロッサム ]
1,980円
Pythonチュートリアル/GuidovanRossum/鴨澤眞夫【1000円以上送料無料】
1,980円
中古 【中古】 Pythonチュートリアル 第3版 /Guido van Rossum(著者),鴨澤眞夫(訳者) 【中古】afb
1,870円
titleを.textとしてテキスト化し、replaceメソッドを使えるようにして改行をなくす
さらに、価格を取得したあとは改行を入れて見やすくする
import requests
from bs4 import BeautifulSoup
def get_rakuten():
url = "https://search.rakuten.co.jp/search/mall/pythonチュートリアル/"
responce = requests.get(url)
html = responce.text
soup = BeautifulSoup(html, "html.parser")
items = soup.select(".searchresultitem")
for item in items:
title = item.select_one(".title").text.replace("\n", "")
price = item.select_one(".important").text
print(title)
print(price + "\n")
get_rakuten()
###商品データを入力, 値段の安い順に表示
?s=2をURLの語尾につけると価格の安い順に表示
?f=2の場合、送料無料の物のみ表示
?f=2&s=2、なら送料無料、価格の安い順にソートした結果が返される
import requests
from bs4 import BeautifulSoup
keyward = input("比較したい商品を入力してください:\n")
def get_rakuten():
url = "https://search.rakuten.co.jp/search/mall/" + keyward + ?f=2&s=2
responce = requests.get(url)
html = responce.text
soup = BeautifulSoup(html, "html.parser")
items = soup.select(".searchresultitem")
for item in items:
title = item.select_one(".title").text.replace("\n", "")
price = item.select_one(".important").text
print(title)
print(price + "\n")
get_rakuten()