案件でメルカリの商品リストの内容をスクレイピングしたいという依頼があったので、サンプルコードを作ってみました。
前準備
メルカリの商品情報はJSで動的生成されているため、requestsのスクレイピングでは200が返ってくるものの商品情報をうまくスクレイピングできません。
なので、Seleniumというブラウザを自動操作するツールを使用する必要があります。導入方法については以下の記事で解説しています。
参考記事:【Python】Seleniumで使用するWebDriverの更新を自動化してコードの挙動を安定させる
Python+Seleniumでメルカリの商品情報の取得を自動化する
import subprocess from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.desired_capabilities import DesiredCapabilities import chromedriver_binary import time cmd = 'pip install --upgrade chromedriver_binary' res = subprocess.call(cmd, shell=True) driver = webdriver.Chrome(ChromeDriverManager().install()) driver.set_window_size('1200','1000') # url = 'https://www.mgstage.com/' # d = DesiredCapabilities.CHROME # d['goog:loggingPrefs'] = { 'performance': 'ALL' } # driver = webdriver.Chrome(desired_capabilities=d) # driver.get(url) def get_source_from_page(driver, page): try: driver.get(page) time.sleep(10) page_source = driver.page_source return page_source except Exception as e: print("Exception¥n" + traceback.format_exc()) return None def get_data_from_source(source): soup = BeautifulSoup(source, 'html.parser') try: info = [] myid = soup.find_all(class_='ItemGrid__ItemGridCell-sc-14pfel3-1 iYYoci') for tag in myid: print('タグ:',tag.find(class_='ItemGrid__StyledThumbnailLink-sc-14pfel3-2 gVKnJ')) print('↓は上のタグから抽出した情報') name = tag.find(class_='ItemGrid__StyledThumbnailLink-sc-14pfel3-2 gVKnJ').find('mer-item-thumbnail').get('item-name') price = tag.find(class_='ItemGrid__StyledThumbnailLink-sc-14pfel3-2 gVKnJ').find('mer-item-thumbnail').get('price') url_path = tag.find(class_='ItemGrid__StyledThumbnailLink-sc-14pfel3-2 gVKnJ').get('href') print('商品名:', name) print('価格:', price) print('個別ページリンク:', url_path) print('---------------------------') info.append([name, price, url_path]) return info except Exception as e: print("Exception¥n" + traceback.format_exc()) return None page = "https://jp.mercari.com/search?keyword=%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B5%E3%83%AA%E3%83%BC%20%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88&price_min=1500&item_condition_id=1&status=sold_out" source = get_source_from_page(driver, page) data = get_data_from_source(source) print('処理完了!') print(data)
まあメルカリはちゃんとしたテック企業なので自動化ツール対策も万全でしょうし、これだけで大量のスクレイピングは難しいと思います。安定的に動作するプログラムを組むのであれば、通信を解析してAPIをハックするか、プロキシやIPを切り替える処理も必要になると思います
コメント