Je souhaite vendre les produits que j'ai listés par python scraping Mercari

Déclencheur

Vendez-vous des choses dont vous n'avez plus besoin avec Mercari? Je vends aussi des livres dont je n'ai plus besoin chez Mercari, mais ce sont tous de vieux livres de référence et des livres d'étude, donc ils sont difficiles à vendre. .. ..

Mercari proposera un "prix vendable" lors de la mise en vente. Cependant, si vous le fixez à un prix élevé, il ne se vendra pas, et s'il est trop bon marché, vous aurez l'impression d'avoir perdu quelque chose.

Avant de fixer le prix d'un article, je fais une fois une recherche pour savoir quel est le prix réel du marché. (Peut-être que je ne suis pas le seul ...)

Cependant, ce travail était assez gênant et je me demandais s'il pouvait être automatisé d'une manière ou d'une autre. J'ai donc utilisé du python pour gratter Mercari et découvrir combien il se vendrait!

Image du résultat

Ce qui suit est un graphique qui a en fait été gratté avec Mercari. Avec ce genre de sentiment, lors de la vente d'un certain produit, il serait préférable de fixer le prix autour de 600 yens. J'ai eu le résultat. mercari_histgram_リンガメタリカ-cd.jpg Ce qui suit décrit comment gratter avec Mercari.

environnement

Préparation environnementale

Préparation de l'environnement virtuel Python

Je ne voulais pas que mon environnement local se salisse, j'ai donc créé un environnement virtuel venv. De plus, Python 3.8.2 est installé localement et le chemin est également transmis.

python -m venv venv

La commande ci-dessus créera un répertoire venv dans le répertoire exécuté.

Comment démarrer dans un environnement virtuel

Entrez la commande suivante à l'emplacement où se trouve le répertoire venv.

venv\Scripts\activate

Vous pouvez maintenant entrer dans l'environnement virtuel si le terminal a les lettres «(venv)» au début.

deactivate

préparation du module python

Les modules suivants sont nécessaires pour exécuter ce programme. Je vais le mettre à l'avance.

pip install pandas matplotlib

Préparation de l'environnement au sélénium

J'ai installé pip dans un environnement virtuel de python.

pip install selenium

Préparation de l'environnement du pilote Chrome

À partir de ce qui suit, préparez le pilote Chrome à utiliser avec Selenium. ChromeDriver - WebDriver for Chrome

Ici, sélectionnez celui qui convient à votre version de Chrome. Ma version de Chrome était 80.0.3987.132, donc la plus proche de celle-ci ChromeDriver 80.0.3987.106 J'ai choisi la version Windows. (En fait, la version 64 bits était bonne, mais comme il n'y avait que la version 32 bits, je n'avais pas d'autre choix que de l'utiliser.)

En passant, vous pouvez vérifier la version de Chrome comme suit. Paramètres Google Chrome-> À propos de Chrome (élément du bas en cliquant sur les trois lignes à gauche)

Après le téléchargement et la décompression, placez chromedriver.exe dans le même répertoire que le fichier python.

Se préparer au grattage

Analyse de l'URL pour la recherche Mercari

L'URL de recherche de produits dans Mercari est la suivante. Exemple 1: Recherche par "PC".

https://www.mercari.com/jp/search/?keyword=ordinateur

Exemple 2: Recherche par "PC" ou "utilisé".

https://www.mercari.com/jp/search/?keyword=ordinateur+d'occasion

Lors d'une recherche avec plusieurs mots, il semble que «+» soit ajouté entre les mots recherchés.

Analyse HTML

Accédez à la page Mercari et utilisez les outils de développement pour vérifier la source HTML. Les outils de développement peuvent être consultés sur la page Web avec la touche "F12".

Information produit

Vous trouverez ci-dessous les informations de référence pour chaque produit qui s'affichent lorsque vous effectuez une recherche avec Mercari. À partir de ces informations, vous pouvez saisir les informations que vous souhaitez en grattant.

<section class="items-box">
  <a href="https://item.mercari.com/jp/~~~~~~~~~~~~~~~~~~~~~~~~~~">
    <figure class="items-box-photo">
      <img
        class="lazyloaded"
        data-src="https://static.mercdn.net/c!/w=240/thumb/photos/~~~~~~~~~~~~"
        alt="ordinateur"
        src="https://static.mercdn.cet/c!/w=240/thumb/photos/~~~~~~~~~~~~~~~~"
      />
      <figcaption>
        <div class="item-sold-out-badge">
          <div>SOLD</div>
        </div>
      </figcaption>
    </figure>
    <div class="itmes-box-body">
      <h3 class="items-box-name font-2">
ordinateur
      </h3>
      <div class="items-box-num">
        <div class="items-box-price font-5">¥19,800</div>
      </div>
    </div>
  </a>
</section>

Nom du produit

<h3 class="items-box-name font-2">
ordinateur
</h3>

prix

<div class="items-box-price font-5">¥19,800</div>

Vendu

Les balises suivantes ont été ajoutées pour les articles qui ont déjà été vendus.

<figcaption>
  <div class="item-sold-out-badge">
    <div>SOLD</div>
  </div>
</figcaption>

Bouton de transition de la page suivante

Pendant que je grattais, j'avais besoin de connaître les informations du bouton de la page suivante, je vais donc le décrire.

<ul class="pager">
  <li class="pager-num">{Numéro de page 1,2,3,4,5 etc.}</li>
  <li class="pager-next visible-pc">
    <ul>
      <li class="pager-cell">
        <a href="/jp/search/?page=~~~~~~~~~~~~~~~~~~~~~">
          <i class="icon-arrow-right"></i>
        </a>
      </li>
      <li class="pager-cell">{Bouton pour passer à la dernière page}</li>
    </ul>
  </li>
</ul>

Bouton de la page suivante

<li class="pager-next visible-pc">
  <ul>
    <li class="pager-cell">
      <a href="/jp/search/?page=~~~~~~~~~~~~~~~~~~~~~">
        <i class="icon-arrow-right"></i>
      </a>
    </li>
  </ul>
</li>

Avant la mise en œuvre

Ce que je voulais faire

  1. Obtenez le prix de l'article vendu pour le mot recherché dans Mercari («scraping»)
  2. Rendez les données grattées visuellement faciles à comprendre (graphisme)
  3. Pour un grand nombre de mots de recherche, allez autour de 1 et 2 ci-dessus ("traitement par lots")

Aperçu de la conception

Voici ce que nous avons fait pour implémenter ce qui précède: Le code source glisse juste pour y arriver.

  1. Mettre en place la liste des produits à rechercher par Mercari dans csv
  2. Lisez 1 fichier csv avec python
  3. Grattage avec le mot de recherche lu
  4. Si le résultat de la recherche s'étend sur plusieurs pages, grattez toutes les pages
  5. Une fois le scraping terminé, exportez le résultat dans un autre fichier csv et enregistrez-le. Créer un graphique basé sur le fichier csv créé dans la version 1.5
  6. Enregistrez le fichier csv et le fichier graphique (.jpg) pour la représentation graphique
  7. Ensuite, bouclez 1 à 7 jusqu'à ce que toute la liste de produits csv soit grattée.

Il est temps de mettre en œuvre

Structure du répertoire

.
├── chromedriver.exe
├── mercari_search.csv
├── scraping_batch.py
└── venv

Description de la configuration

Cette source est à peu près divisée en trois parties.

search_mercari(search_words)

Une fonction qui effectue le grattage. L'argument est un mot de recherche.

make_graph(search_words, except_words, max_price, bins)

Une fonction qui dessine un graphique basé sur les informations récupérées. Entrez le mot de recherche, le mot à exclure, la valeur maximale du produit de recherche et la largeur du graphique dans chaque argument.

read_csv()

Chargez le fichier csv de la liste de recherche préparée à l'avance.

la mise en oeuvre

scraping_batch.py


import pandas as pd
from selenium import webdriver
import matplotlib.pyplot as plt
import time
import csv
import os


def search_mercari(search_words):

    #Évacuer temporairement car le mot de recherche est utilisé comme nom de répertoire tel quel
    org_search_words = search_words

    #S'il y a plusieurs mots de recherche, "+Forme avec laquelle se connecter "
    words = search_words.split("_")
    search_words = words[0]
    for i in range(1, len(words)):
        search_words = search_words + "+" + words[i]

    #URL de recherche par Mercari
    url = "https://www.mercari.com/jp/search/?keyword=" + search_words

    #Navigateur ouvert
    #Chrome River dans le même répertoire que ce fichier python.Si vous avez un exe
    #L'argument peut être vide
    browser = webdriver.Chrome()

    #5 secondes de sommeil car il faut du temps pour démarrer
    time.sleep(5)

    #Afficher la page
    page = 1
    #Créer une liste
    columns = ["Name", "Price", "Sold", "Url"]
    #Spécifiez le nom de la baie
    df = pd.DataFrame(columns=columns)

    #Courir
    try:
        while(True):
            #Rechercher avec le navigateur
            browser.get(url)
            #Obtenez tout le HTML pour chaque produit
            posts = browser.find_elements_by_css_selector(".items-box")
            #Afficher le nombre de pages que vous obtenez
            print(str(page) + "Obtenir la page")

            #Obtenez le nom et le prix de chaque produit, qu'il soit acheté ou non, URL
            for post in posts:
                #Nom du produit
                title = post.find_element_by_css_selector(
                    "h3.items-box-name").text

                #Obtenez le prix
                price = post.find_element_by_css_selector(
                    ".items-box-price").text
                #Supprimé car des éléments supplémentaires seront acquis
                price = price.replace("¥", "")
                price = price.replace(",", "")

                #Défini sur 1 si acheté, 0 si non acheté
                sold = 0
                if (len(post.find_elements_by_css_selector(".item-sold-out-badge")) > 0):
                    sold = 1

                #Obtenez l'URL du produit
                Url = post.find_element_by_css_selector(
                    "a").get_attribute("href")

                #Ajouter des informations récupérées à la liste
                se = pd.Series([title, price, sold, Url], columns)
                df = df.append(se, columns)

            #Incrémenter le nombre de pages
            page += 1
            #Obtenez l'URL pour aller à la page suivante
            url = browser.find_element_by_css_selector(
                "li.pager-next .pager-cell a").get_attribute("href")
            print("Moving to next page ...")
    except:
        print("Next page is nothing.")

    #Enregistrer les dernières données obtenues au format CSV
    filename = "mercari_scraping_" + org_search_words + ".csv"
    df.to_csv(org_search_words + "/" + filename, encoding="utf-8-sig")
    print("Finish!")


def make_graph(search_words, except_words, max_price, bins):
    #Ouvrez le fichier CSV
    df = pd.read_csv(search_words + "/" +
                     "mercari_scraping_" + search_words + ".csv")

    # "Name"À"except_words"Sauf pour ceux contenant
    if(len(except_words) != 0):
        exc_words = except_words.split("_")
        for i in range(len(exc_words)):
            df = df[df["Name"].str.contains(exc_words[i]) == False]
    else:
        pass

    #Acheté(sold=1)Afficher uniquement les produits
    dfSold = df[df["Sold"] == 1]

    #prix(Price)Affiche uniquement les produits avec un prix de 1500 yens ou moins
    dfSold = dfSold[dfSold["Price"] < max_price]

    #Spécifiez le nom de la colonne "Prix" "Nombre à ce prix" "Pourcentage"
    columns = ["Price",  "Num", "Percent"]

    #Spécifiez le nom de la baie
    all_num = len(dfSold)
    num = 0
    dfPercent = pd.DataFrame(columns=columns)

    for i in range(int(max_price/bins)):

        MIN = i * bins - 1
        MAX = (i + 1) * bins

        #Ne listez que ceux entre les valeurs MIN et MAX, len()Obtenez le numéro en utilisant
        df0 = dfSold[dfSold["Price"] > MIN]
        df0 = df0[df0["Price"] < MAX]
        sold = len(df0)

        #Je veux le rendre cumulatif, donc je vais ajouter ce nombre à num
        num += sold

        #Calculez le pourcentage ici
        percent = num / all_num * 100

        #Le prix est la valeur médiane de MIN et MAX
        price = (MIN + MAX + 1) / 2
        se = pd.Series([price, num, percent], columns)
        dfPercent = dfPercent.append(se, columns)

    #Enregistrer au format CSV
    filename = "mercari_histgram_" + search_words + ".csv"
    dfPercent.to_csv(search_words + "/" + filename, encoding="utf-8-sig")

    #Dessiner un graphique
    """
    :param kind:Spécifiez le type de graphique
    :param y:Spécifiez la valeur de l'axe y
    :param bins:Spécifiez la largeur du graphique
    :param alpha:Transparence du graphique(0:Transparent~ 1:Sombre)
    :param figsize:Spécifiez la taille du graphique
    :param color:Couleur du graphique
    :param secondary_y:Spécification de l'utilisation 2 axes(Si vrai)
    """
    ax1 = dfSold.plot(kind="hist", y="Price", bins=25,
                      secondary_y=True, alpha=0.9)
    dfPercent.plot(kind="area", x="Price", y=[
        "Percent"], alpha=0.5, ax=ax1, figsize=(20, 10), color="k")
    plt.savefig(search_words + "/" + "mercari_histgram_" +
                search_words + ".jpg ")


def read_csv():
    #Lire le fichier csv de la liste de recherche Mercari
    with open("mercari_search.csv", encoding="utf-8") as f:

        #Préparez une liste vide pour stocker les mots de recherche
        csv_lists = []
        #Compteur pour vérifier quelle ligne du fichier csv lire
        counter = 0

        #Lire le fichier csv ligne par ligne
        reader = csv.reader(f)
        for row in reader:
            counter += 1
            csv_lists.append(row)
            try:
                #Vérification des mots de recherche
                #Si vide, affichez un message d'erreur et quittez
                if(len(row[0]) == 0):
                    print("File Error:Aucun mot de recherche-> " +
                          "mercari_search.csv " + str(counter) + "Ligne")
                    break
            except IndexError:
                #Si la ligne est vide, affichez un message d'erreur et quittez
                print("File Error:Il y a un problème avec le fichier CSV. Veuillez fermer l'interligne.")
                break
            try:
                if(len(row[2]) == 0):
                    #Vérifiez la valeur la plus élevée lors du dessin d'un graphique
                    #Si vide, affichez un message d'erreur et quittez
                    print("File Error:Aucun montant n'a été fixé-> " +
                          "mercari_search.csv " + str(counter) + "Ligne")
                    break
                else:
                    try:
                        int(row[2])
                    except ValueError:
                        #Si la valeur n'apparaît pas, un message d'erreur s'affiche et le processus se termine.
                        print("File Error:Veuillez saisir un nombre pour le montant-> " +
                              "mercari_search.csv " + str(counter) + "Ligne")
                        break
            except IndexError:
                #Si le montant lui-même n'est pas écrit en premier lieu, un message d'erreur s'affiche et le processus se termine.
                print("File Error:Aucun montant n'a été fixé-> " +
                      "mercari_search.csv " + str(counter) + "Ligne")
                break
            try:
                if(len(row[3]) == 0):
                    #Vérifiez la valeur la plus élevée lors du dessin d'un graphique
                    #Si vide, affichez un message d'erreur et quittez
                    print("File Error:La largeur du graphique n'est pas définie-> " +
                          "mercari_search.csv " + str(counter) + "Ligne")
                    break
                else:
                    try:
                        int(row[3])
                    except ValueError:
                        #Si la valeur n'apparaît pas, un message d'erreur s'affiche et le processus se termine.
                        print("File Error:Veuillez saisir un nombre pour la largeur du graphique->" +
                              "mercari_search.csv " + str(counter) + "Ligne")
                        break
            except IndexError:
                #Si le montant lui-même n'est pas écrit en premier lieu, un message d'erreur s'affiche et le processus se termine.
                print("File Error:La largeur du graphique n'est pas définie-> " +
                      "mercari_search.csv " + str(counter) + "Ligne")
                break
        return csv_lists

# ------------------------------------------------------ #


# 0.Préparer une boîte pour stocker la liste lue à partir du fichier CSV de recherche Mercari
"""
Lire la liste à partir du fichier CSV de recherche
:param csv_lists[i][0]:Rechercher un mot
:param csv_lists[i][1]:Mots à exclure des résultats de recherche
:param csv_lists[i][2]:Montant maximum lors de l'affichage d'un graphique
:param csv_lists[i][3]:Largeur du graphique(bin)
"""
csv_lists = read_csv()

#Le traitement par lots
for i in range(len(csv_lists)):
    # 1.Créer un répertoire
    os.mkdir(csv_lists[i][0])
    # 2.Processus de grattage
    search_mercari(csv_lists[i][0])
    # 3.Dessin graphique
    make_graph(csv_lists[i][0], csv_lists[i][1],
               int(csv_lists[i][2]), int(csv_lists[i][3]))

Comment utiliser

1. Préparation de la liste de mots de recherche

Entrez les mots que vous souhaitez rechercher, les mots que vous souhaitez exclure, le montant maximal et la largeur du graphique dans mercari_search.csv.

Lors de la séparation de chaque mot, il s'agit d'un fichier csv, donc séparez-le par une virgule (,).

Exemple:

l'horloge,Numérique,10000,100
portefeuille,Vache,3000,100
Pokémon_Jeu,carte_CD,3000,100
ordinateur,,15000,500

2. Effectuer le grattage

Assurez-vous que «chromedriver.exe» et «mercari_search.py» se trouvent dans le même répertoire que ce fichier source («scraping_batch.py») et exécutez la commande suivante.

python scraping_batch.py

Lors de l'exécution, le nombre de pages récupérées s'affiche comme indiqué ci-dessous.

1 page est en cours d'acquisition
Moving to next page ...
Obtenir 2 pages
Moving to next page ...
Acquérir 3 pages
・ ・ ・
Obtenir 22 pages
Moving to next page ...
23 pages sont en cours d'acquisition
Next page is nothing.
Finish!

3. Vérifiez le résultat

L'exécution de python dans 2 ci-dessus créera un répertoire en fonction de votre terme de recherche. Un graphique sera créé dans ce répertoire à la suite du grattage avec Mercari, alors vérifiez le résultat.

Si vous n'êtes pas satisfait des résultats, reconfigurez votre fichier csv et réessayez de gratter!

Mise en garde

Le même répertoire que le mot de recherche est créé dans le même répertoire que le fichier python (pour éviter qu'un grand nombre de fichiers ne soit créé dans le répertoire où le fichier python existe). Si le même répertoire que le mot de recherche existe déjà, ou si le même mot de recherche existe dans le csv de recherche (mercari_search.csv), le processus de création du répertoire (ʻos.mkdir ()`) ne fonctionnera pas correctement. Le grattage s'arrête au milieu. Par conséquent, lorsque vous commencez à gratter, veillez à ce que le même répertoire que le mot de recherche n'existe pas et que vous n'entriez pas le même mot de recherche dans le fichier csv.

Essayez de créer

En fait, j'ai essayé de gratter avec le produit "Linga Metallica" (livre de mots anglais connu des connaisseurs) actuellement en vente. Les mots et paramètres utilisés lors de la recherche sont les suivants. (Parce que je veux vendre le corps principal du livre de mots de Ringa Metallica, j'essaie d'exclure ceux qui ont le mot «CD» dans le mot de recherche.) Linga Metallica, CD, 1500, 50 Suite à la rotation de la source ci-dessus, le graphique suivant est créé. mercari_histgram_リンガメタリカ-cd.jpg En regardant ça,

Le résultat était ça. Sur ce graphique, vous pouvez voir que si vous voulez vendre "Ringa Metallica", environ 600 yens sont un prix raisonnable.

Au fait

Au moment de la rédaction de cet article, j'ai essayé de vendre "Linga Metallica" sans "rayures ou taches visibles". A cette époque, le prix du marché proposé par Mercari était de "640 yens" (le prix facile à vendre était de 460 à 790 yens).

Peut-être que le côté Mercari offrait un montant raisonnable sans avoir à se gratter et à se vérifier. .. ..

à partir de maintenant

Il y a cinq choses auxquelles je pense en ce moment: J'aimerais le faire même si j'ai le temps lentement dans le futur.

――Les produits étant répertoriés sur d'autres sites frima, j'aimerais utiliser le même grattage que ci-dessus pour obtenir des informations sur les ventes de produits. ――Je pense que la valeur du produit changera en fonction de la date de sortie et de la saison, j'aimerais donc classer le prix par série chronologique ou par saison. ――Le prix change en fonction de l'état du produit, je voudrais donc gratter "l'état du produit" en tant qu'élément.

C'est tout pour cette fois. Jusqu'à la fin Merci d'avoir lu.

Lien vers Github

kewpie134134/fleamarket_app_scraping

référence

Recommended Posts

Je souhaite vendre les produits que j'ai listés par python scraping Mercari
Je veux déboguer avec Python
Je veux utiliser jar de python
Je veux créer un environnement Python
Je veux analyser les journaux avec Python
Je veux jouer avec aws avec python
Je veux faire le test de Dunnett en Python
Je veux utiliser MATLAB feval avec python
Je veux mémoriser, y compris les arguments de mots clés de Python
Je veux créer une fenêtre avec Python
Je souhaite envoyer un e-mail depuis Gmail en utilisant Python.
[Python] Je veux gérer 7DaysToDie depuis Discord! 1/3
Je veux faire un jeu avec Python
Je veux fusionner des dictionnaires imbriqués en Python
Je veux gérer systemd par fuseau horaire! !!
Je souhaite utiliser le répertoire temporaire avec Python2
Je veux utiliser le solveur ceres de python
#Unresolved Je veux compiler gobject-introspection avec Python3
Je veux résoudre APG4b avec Python (chapitre 2)
[Python] Je veux gérer 7DaysToDie depuis Discord! 2/3
Je veux créer du code C ++ à partir de code Python!
Je veux écrire dans un fichier avec Python
Je veux afficher la progression en Python!
Je veux écrire en Python! (1) Vérification du format de code
Même les débutants veulent dire "Je comprends parfaitement Python"
Je souhaite intégrer une variable dans une chaîne Python
Je veux facilement implémenter le délai d'expiration en python
Je veux générer rapidement UUID (memo memo) ~ Edition Python ~
Je veux gérer l'optimisation avec python et cplex
Même avec JavaScript, je veux voir Python `range ()`!
Je veux hériter de l'arrière avec la classe de données python
Je veux travailler avec un robot en python.
[Python] Je veux faire d'une liste imbriquée un taple
Je veux écrire en Python! (3) Utiliser des simulacres
Je veux AWS Lambda avec Python sur Mac!
Je veux utiliser le jeu de données R avec python
Je veux faire fonctionner un ordinateur quantique avec Python
Je veux faire quelque chose avec Python à la fin
Je veux manipuler des chaînes dans Kotlin comme Python!
Je veux résoudre SUDOKU
J'ai essayé de gratter avec du python
Je veux pouvoir analyser des données avec Python (partie 3)
Je veux initialiser si la valeur est vide (python)
Je souhaite spécifier une autre version de Python avec pyvenv
Je souhaite enregistrer les photos envoyées par LINE vers S3
maya Python Je veux réparer à nouveau l'animation cuite.
Je veux pouvoir analyser des données avec Python (partie 1)
Je veux faire quelque chose comme sort uniq en Python
[Python] Je souhaite obtenir un ensemble commun entre numpy
Je veux démarrer beaucoup de processus à partir de python
Je veux pouvoir analyser des données avec Python (partie 4)
Je veux pouvoir analyser des données avec Python (partie 2)
Je veux assister automatiquement à des cours en ligne avec Python + Selenium!
[Python] Je souhaite utiliser l'option -h avec argparse
Je souhaite envoyer un message de Python à LINE Bot
Je veux connaître la nature de Python et pip
Je veux que Sphinx soit pratique et utilisé par tout le monde
Je veux pouvoir exécuter Python avec VS Code