案件でメルカリの商品リストの内容をスクレイピングしたいという依頼があったので、サンプルコードを作ってみました。
前準備
メルカリの商品情報は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を切り替える処理も必要になると思います
コメント