Python Selenium スクレイピング

【Python】メリカリの検索結果から商品名・価格・URLをSeleniumで取得するサンプルプログラムを作ってみた

この記事は約5分で読めます。

 

案件でメルカリの商品リストの内容をスクレイピングしたいという依頼があったので、サンプルコードを作ってみました。

 

前準備

 

メルカリの商品情報は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を切り替える処理も必要になると思います

 

 

 

 

コメント

タイトルとURLをコピーしました