ヨドバシカメラをスクレイピング
ヨドバシカメラをスクレイピングしようとしてseleniumやらpuppeteerやら
試したが、結果的に諦めた方多いのではないでしょうか?
結論から言うと、
必要なのは HTTP Headerです!
下記の4つを Request Header に追加してください。
"UserAgent": "Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML, like Gecko) Chrome/102.0.5005.167 Safari/537.36",
"Accept-Language": "ja,en-us;q=0.7,en;q=0.3",
"Accept-Encoding": "HTTP::Message::decodable",
"Accept": "text/html,application/xhtml_xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
あとは普通にGetしてあれこれ欲しい情報を抽出してみましょう!
基本URL https://www.yodobashi.com に加えて
検索クエリ word=yourkeyword
販売終了商品表示 discontinued=true
予約商品表示は opt=2
価格の下限 lower=1000
価格の上限 upper=5000
表示順
・人気順 sorttyp=COINCIDENCE_RANKING
・新着順 sorttyp=NEW_ARRIVAL_RANKING
・価格(安)順 sorttyp=SELL_PRICE_ASC
・価格(高)順 sorttyp=SELL_PRICE_DESC
・発売日(新)順 sorttyp=RELEASE_DATE_DESC
などをURL Query Parameterに追加することで検索条件を指定できます。
URL Encodeをお忘れなく!
e.g https://www.yodobashi.com/?word=ps5&discontinued=true&lower=4000
以下、商品名、価格、URLを取得するサンプルコードです。
・Python (3系)
import urllib.parse
import re
import requests
from bs4 import BeautifulSoup
yodobashi_url = "https://www.yodobashi.com"
url_params = {"word": "rtx3090", "discontinued": "true", "lower": "4000"}
req_url = yodobashi_url + "/?" + urllib.parse.urlencode(url_params)
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.167 Safari/537.36",
"Accept-Language": "ja,en-us;q=0.7,en;q=0.3",
"Accept-Encoding": "HTTP::Message::decodable",
"Accept": "text/html,application/xhtml_xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
}
try:
res = requests.get(req_url, headers=headers)
res.raise_for_status()
except requests.exceptions.RequestException as e:
print("Failed to http request:", e)
else:
product_datas = []
soup = BeautifulSoup(res.text, "html.parser")
for item in soup.find_all("div", class_="productListTile"):
a = item.find(href=re.compile("/product/"))
product_url = yodobashi_url + a.attrs['href']
product_name = a.find("img").attrs['alt']
product_price = item.find("ul", class_="js_addLatestSalesOrder").find(text=re.compile("¥")).text
product_datas.append({
"name": product_name,
"price": product_price,
"url": product_url,
})
print(len(product_datas))
print(product_datas[0])