【Python】メルカリ再出品したいのでSeleniumで出品情報取得してみた

※ご利用は自己判断でお願いします※

にも@社畜SEもメルカリに不用品を出しているわけですが、出品してから時間が経ったものって全然売れないんですよね。最初はちまちまとスマホで再出品していたんですけど、出品している商品のページを開く⇒文章コピー⇒新規出品画面開く⇒貼り付けって流れがどうしてもめんどくさくて放置してしまう…

というわけで、せめて文章コピーするところだけでも先にやっておけないかな~と思いPython自動化を試みました。

やりたいこと

やりたいことは以下の3点です。

  • 自分の商品ページにアクセス
  • 商品の情報を取得してcsvに保存
  • 商品画像をフォルダに保存

注意点

最初にも書きましたが、ご利用は自己責任でお願いします。メルカリの規約はこちらです。 help.jp.mercari.com

今回の方法は「ページを開き、情報をCSVにコピペする」という、人間が行う作業を自動化しているだけなので、

・ 弊社が提供するインターフェイスとは別の手法を用いてサービスにアクセスすること

・ 弊社の事前の書面による許可なく、弊社のサービス外のところで、商業目的で、弊社が提供するあらゆるサービス、コンテンツ、情報、システム、機能、プログラムなどの全部または一部を利用すること

には該当しないと考えています。

また、プログラム中に何度か10秒の待機時間を挟んでいます。これを入れないと、短時間に大量のアクセスが発生してしまうので、サーバーに負荷がかかり、以下の規約に引っかかる可能性があります。

コンピュータウィルスの送信など、コンピュータの機器や通信回線、ソフトウェアなどの機能に悪影響を及ぼす行為

・弊社が提供するサービスに繋がっているサーバーやネットワークに対して悪影響を及ぼすこと

今回のプログラムを利用して他の機能を追加したりする場合は十分気を付けたうえで行ってください。 メルカリのサイトも日々変わっていますし、そのままコピペしても使えないかもしれません。

コード

from contextlib import nullcontext
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.select import Select
from time import sleep
import random
import csv
import os
import datetime
import requests
from selenium.webdriver.chrome.options import Options

### 定義 ###
image_path = "画像保存場所のパス"
dt_now = datetime.datetime.now()  #現在時刻の取得
csv_name = './mercari_'+dt_now.strftime('%Y%m%d%H%M%S')+'.csv'
HTTP_HEADERS = {' '}

### 関数 ###

# 項目が存在する場合、その項目のテキスト情報を取得する関数
def check_info(driv, path):
    if(driv.find_elements_by_xpath(path)):
        return driv.find_element_by_xpath( path ).text.replace('\n匿名配送','')
    else:
        return None


### main ###

# chromeの起動
options = webdriver.chrome.options.Options()
profile_path = ''
options.add_argument('--user-data-dir=' + profile_path)
driver = webdriver.Chrome("./chromedriver", options=options)

# 読み込みが遅いかもしれないので10秒待つ
sleep(10)


# csvを開く
with open(csv_name, mode='w',newline='') as f:
    writer = csv.writer(f) 

    ### 情報取得 ###
    # メルカリマイページにアクセス
    URL = 'メルカリマイページアドレス'
    driver.get(URL)
    sleep(10)

    # 商品リスト取得
    a = driver.find_elements_by_xpath( "//*[@class='ItemGrid__StyledThumbnailLink-sc-14pfel3-2 gVKnJ']" )
    links = [i.get_attribute('href') for i in a]


    # 各商品処理
    stock_num=0

    for link in links:
        # 個数カウント
        stock_num=stock_num+1

        # 商品画面を開く
        driver.get(link)
        sleep(10)

        # 売り切れの場合はスルー
        if (driver.find_element_by_xpath( "//*[@data-testid='image-0']" ).get_attribute('sticker')!="sold"):
        
            ## 画像保存 ##
            # 画像数カウント
            img_count = len(driver.find_elements_by_xpath("//*[@class='slick-slide slick-active']")) + 1

            # 画像保存用フォルダ作成
            os.makedirs(image_path+str(stock_num), exist_ok=True)

            # 画像を順番に保存していく
            for num in range(img_count):
                # 小さいサムネイルクリック
                # driver.find_element_by_xpath( "//*[@data-testid='imageThumbnail-"+str(num)+"']" ).click()
                # sleep(10)
                

                # 画像URL取得
                img_url = img_elem.get_attribute('src') 
                img_name=image_path+str(stock_num)+"\\"+str(num)+".png"

                r = requests.get(img_url, headers=HTTP_HEADERS)

                with open(img_name,'wb') as img_name:
                    img_name.write(r.content)

                sleep(10)


            ## 商品情報を保存 ##
            category_num = driver.find_elements_by_xpath("//*[@data-location='item:item_detail_table:link:go_search']")
            category_list = [i.get_attribute('text') for i in category_num]

            size_inf = check_info(driver,"//*[@data-testid='商品のサイズ']")
            brand = check_info(driver,"//*[@data-testid='ブランド']")
            itemCondition = check_info(driver,"//*[@data-testid='商品の状態']")
            name_inf = driver.find_element_by_xpath("//*[@data-testid='name']").get_attribute('title-label') 
            description_inf = driver.find_element_by_xpath("//*[@data-testid='description']").text
            shipP = check_info(driver,"//*[@data-testid='配送料の負担']")
            shipM = check_info(driver,"//*[@data-testid='配送の方法']")
            shipFA = check_info(driver,"//*[@data-testid='発送元の地域']")
            shipD = check_info(driver,"//*[@data-testid='発送までの日数']")
            price_inf = driver.find_element_by_xpath("//*[@data-testid='price']").get_attribute('value') 

            # csvファイルに書き込み
            writer.writerow([img_count, category_list[0], category_list[1], category_list[2], size_inf, brand, itemCondition, name_inf, description_inf, shipP, shipM, shipFA, shipD, price_inf]) 

            sleep(10) 

実行

実行すると自動でChromeが立ち上がり、メルカリのページがパカパカ動きます。何か作業をしているときは邪魔かもしれないので気を付けてください。

保存されたCSVファイルはこのような感じです。

CSVファイル

後は、出品画面にコピペするだけです。おかげですごく楽になりました。売れるといいなぁ・・・