ヨドバシカメラをスクレイピング

ヨドバシカメラをスクレイピングしようとして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])

#スクレイピング #Python #ヨドバシカメラ