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!
github
à la fin de la page, alors jouez avec!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. Ce qui suit décrit comment gratter avec Mercari.
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é.
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
Les modules suivants sont nécessaires pour exécuter ce programme. Je vais le mettre à l'avance.
pip install pandas matplotlib
J'ai installé pip dans un environnement virtuel de python.
pip install selenium
À 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.
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.
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".
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>
<h3 class="items-box-name font-2">
ordinateur
</h3>
<div class="items-box-price font-5">¥19,800</div>
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>
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>
<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>
graphisme
)Voici ce que nous avons fait pour implémenter ce qui précède: Le code source glisse juste pour y arriver.
.
├── chromedriver.exe
├── mercari_search.csv
├── scraping_batch.py
└── venv
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.
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]))
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.
trait de soulignement demi-largeur (_)
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
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!
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!
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.
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éé.
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 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. .. ..
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.
kewpie134134/fleamarket_app_scraping
Recommended Posts