【Python スクレイピング】インプットボックスでメルカリ検索

Python

2022年7月23日現在のWebサイトでスクレイピングしています。今後サイトの仕様に変更があった場合は、下記のコードではスクレイピングできない場合があります>

メルカリの検索キーワードを入力するインプットボックスを表示し、そこに入力したワードでメルカリを検索します。

検索結果は、エディタのターミナルに表示するとともに、指定したcsvファイルに書き出します。

【下記コードの実行方法】
下記のコードをVSCode等のエディタに貼り付け、実行します。

from email import message
import time
import tkinter as tk
import tkinter.messagebox
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import csv

root = tk.Tk()
root.title("メルカリ検索")
root.geometry("1000x100")

entry = tk.Entry(width=80)
entry.place(x=20, y=30)

button = tk.Button(text="左のボックスに検索したい商品名を入力してこのボタンをクリックしてください")
button.place(x=500, y=26)

def click():
    global searchWord
    searchWord = entry.get()    
    root.destroy()    

button["command"] = click
root.mainloop()
print(searchWord)

myUrl = 'https://jp.mercari.com'
iniUrl = myUrl + '/search/?keyword=' + searchWord + '&status=on_sale'
trgUrl = iniUrl
page_cnt = 0

chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option(	"excludeSwitches", ['enable-automation'])
chrome_options.add_argument('--headless')
driver_Path = r'C:\Users\★★★\AppData\Local\SeleniumBasic\chromedriver.exe'
driver = webdriver.Chrome(driver_Path, options=chrome_options)
driver.implicitly_wait(10)

result = []
j =1
while True:
    try:
        driver.get(trgUrl)
        time.sleep(5)
        html = driver.page_source #.encode('utf-8')
        soup = BeautifulSoup(html, 'html.parser')
        items_list = soup.find_all("li", attrs={'data-testid':'item-cell'})
        for i, item in enumerate(items_list,1):
            if item.text =="":
                item_name = item.find("mer-item-thumbnail").get('item-name')
            else:
                item_name = item.text
            item_price = int(item.find("mer-item-thumbnail").get('price'))
            item_link = myUrl + item.find('a').get('href')            
            print(j,item_name)
            print("    ",item_price)
            print("    ",item_link)
            result.append([j,item_name,item_price,item_link])
            j+=1

        next_button_exist = soup.find('mer-button',attrs={'data-testid':"pagination-next-button"})
        if next_button_exist:
            page_cnt += 1
            next_url = iniUrl + '&page_token=v1%3A' + str(page_cnt)
            trgUrl = next_url
            next_url = ''
        else:
            break

    # エラー発生時の例外処理
    except Exception as e:
        message = "[エラー]"+"type:{0}".format(type(e))+"\n"+"args:{0}".format(e.args)
        print(message)

# Chrome終了処理
driver.close()
driver.quit()
print(result)

# csvに結果出力
headers = ['No.','商品名','出品価格','商品詳細URL']
#このファイルと同じディレクトリに「'mercari_' + searchWord + '.csv'」を新規作成して検索結果を書き込み
with open('mercari_' + searchWord + '.csv', 'w', newline='',errors='ignore') as f: 
    csv_writer = csv.writer(f)
    csv_writer.writerow(headers)
    csv_writer.writerows(result)

print('--- END ---')

tk.Tk().withdraw()
tk.messagebox.showinfo('スクレイピング終了','検索が終了しました。')

コメント

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