Verkauft ihr Dinge, die ihr mit Mercari nicht mehr braucht? Ich verkaufe auch Bücher, die ich bei Mercari nicht mehr brauche, aber es sind alles alte Nachschlagewerke und Lernbücher, daher sind sie schwer zu verkaufen. .. ..
Mercari wird bei der Auflistung einen "Verkaufspreis" vorschlagen. Wenn Sie jedoch einen hohen Preis festlegen, wird es nicht verkauft, und wenn es zu billig ist, haben Sie das Gefühl, etwas verloren zu haben.
Bevor ich den Preis eines Artikels festlege, suche ich einmal nach dem tatsächlichen Marktpreis. (Vielleicht bin ich nicht der einzige ...)
Diese Arbeit war jedoch ziemlich mühsam und ich fragte mich, ob sie irgendwie automatisiert werden könnte. Also habe ich Python benutzt, um Mercari abzukratzen und herauszufinden, wie viel es verkaufen würde!
Das folgende Diagramm wurde tatsächlich mit Mercari erstellt. Mit diesem Gefühl ist es beim Verkauf eines bestimmten Produkts besser, den Preis auf 600 Yen festzusetzen. Ich habe das Ergebnis. Im Folgenden wird beschrieben, wie Sie mit Mercari kratzen.
Ich wollte nicht, dass meine lokale Umgebung schmutzig wird, also habe ich eine virtuelle venv-Umgebung erstellt. Außerdem wird Python 3.8.2 lokal installiert und der Pfad wird ebenfalls übergeben.
python -m venv venv
Der obige Befehl erstellt ein venv
-Verzeichnis im ausgeführten Verzeichnis.
Geben Sie den folgenden Befehl an der Stelle ein, an der sich das Verzeichnis venv
befindet.
venv\Scripts\activate
Jetzt können Sie die virtuelle Umgebung betreten, wenn das Terminal am Anfang die Buchstaben "(venv)" hat.
deactivate
Die folgenden Module sind erforderlich, um dieses Programm auszuführen. Ich werde es im Voraus setzen.
pip install pandas matplotlib
Ich habe pip in einer virtuellen Python-Umgebung installiert.
pip install selenium
Bereiten Sie im Folgenden den Chrome-Treiber für die Verwendung mit Selenium vor. ChromeDriver - WebDriver for Chrome
Wählen Sie hier diejenige aus, die zu Ihrer Chrome-Version passt. Meine Chrome-Version war "80.0.3987.132", also die nächstgelegene ChromeDriver 80.0.3987.106 Ich habe die Windows-Version gewählt. (Eigentlich war die 64-Bit-Version gut, aber da es nur die 32-Bit-Version gab, hatte ich keine andere Wahl, als sie zu verwenden.)
Übrigens können Sie die Chrome-Version wie folgt überprüfen.
Google Chrome-Einstellungen-> Über Chrome (unteres Element durch Klicken auf die drei Zeilen links)
Platzieren Sie nach dem Herunterladen und Entpacken "chromedriver.exe" im selben Verzeichnis wie die Python-Datei.
Die URL für die Suche nach Produkten in Mercari lautet wie folgt. Beispiel 1: Suche nach "PC".
https://www.mercari.com/jp/search/?keyword=Computer
Beispiel 2: Suche nach "PC" oder "gebraucht".
https://www.mercari.com/jp/search/?keyword=Computer+gebraucht
Bei der Suche mit mehreren Wörtern scheint zwischen den Suchwörtern "+" eingefügt zu sein.
Gehen Sie zur Mercari-Seite und überprüfen Sie mit den Entwicklertools die HTML-Quelle. Entwicklertools können auf der Webseite mit der Taste "F12" angezeigt werden.
Unten finden Sie die Referenzinformationen für jedes Produkt, die bei der Suche mit Mercari angezeigt werden. Aus diesen Informationen können Sie die gewünschten Informationen durch Scraping erfassen.
<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="Computer"
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">
Computer
</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">
Computer
</h3>
<div class="items-box-price font-5">¥19,800</div>
Die folgenden Tags wurden für Artikel hinzugefügt, die bereits verkauft wurden.
<figcaption>
<div class="item-sold-out-badge">
<div>SOLD</div>
</div>
</figcaption>
Während ich kratzte, musste ich die Informationen der Schaltfläche für die nächste Seite kennen, damit ich sie beschreiben kann.
<ul class="pager">
<li class="pager-num">{Seitenzahl 1,2,3,4,5 usw.}</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">{Schaltfläche, um zur letzten Seite zu gelangen}</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>
Scraping
)Grafik
)Folgendes haben wir getan, um das oben Gesagte zu implementieren: Der Quellcode schlürft nur, um dies zu ermöglichen.
.
├── chromedriver.exe
├── mercari_search.csv
├── scraping_batch.py
└── venv
Diese Quelle ist grob in drei Teile unterteilt.
search_mercari(search_words)
Eine Funktion, die das Scraping ausführt. Das Argument ist ein Suchwort.
make_graph(search_words, except_words, max_price, bins)
Eine Funktion, die basierend auf den gescrapten Informationen ein Diagramm zeichnet. Geben Sie in jedes Argument das Suchwort, das auszuschließende Wort, den Maximalwert des Suchprodukts und die Diagrammbreite ein.
read_csv()
Laden Sie die CSV-Datei der zuvor erstellten Suchliste.
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):
#Vorübergehend evakuieren, da das Suchwort unverändert als Verzeichnisname verwendet wird
org_search_words = search_words
#Wenn es mehrere Suchwörter gibt, "+Form zum Verbinden mit "
words = search_words.split("_")
search_words = words[0]
for i in range(1, len(words)):
search_words = search_words + "+" + words[i]
#URL zur Suche nach Mercari
url = "https://www.mercari.com/jp/search/?keyword=" + search_words
#Browser öffnen
#Chrome River im selben Verzeichnis wie diese Python-Datei.Wenn Sie eine Exe haben
#Das Argument ist möglicherweise leer
browser = webdriver.Chrome()
#5 Sekunden Schlaf, da das Booten einige Zeit in Anspruch nimmt
time.sleep(5)
#Seite anzeigen
page = 1
#Erstelle eine Liste
columns = ["Name", "Price", "Sold", "Url"]
#Geben Sie den Array-Namen an
df = pd.DataFrame(columns=columns)
#Lauf
try:
while(True):
#Suche mit dem Browser
browser.get(url)
#Holen Sie sich alle HTML für jedes Produkt
posts = browser.find_elements_by_css_selector(".items-box")
#Zeigen Sie, wie viele Seiten Sie erhalten
print(str(page) + "Seite abrufen")
#Holen Sie sich Name und Preis für jedes Produkt, ob gekauft oder nicht, URL
for post in posts:
#Produktname
title = post.find_element_by_css_selector(
"h3.items-box-name").text
#Holen Sie sich den Preis
price = post.find_element_by_css_selector(
".items-box-price").text
#Gelöscht, weil zusätzliche Dinge erworben werden
price = price.replace("¥", "")
price = price.replace(",", "")
#Auf 1 setzen, wenn gekauft, 0, wenn nicht gekauft
sold = 0
if (len(post.find_elements_by_css_selector(".item-sold-out-badge")) > 0):
sold = 1
#Holen Sie sich die Produkt-URL
Url = post.find_element_by_css_selector(
"a").get_attribute("href")
#Fügen Sie der Liste abgekratzte Informationen hinzu
se = pd.Series([title, price, sold, Url], columns)
df = df.append(se, columns)
#Erhöhen Sie die Anzahl der Seiten
page += 1
#Rufen Sie die URL ab, um zur nächsten Seite zu gelangen
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.")
#Speichern Sie die zuletzt erhaltenen Daten als 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):
#Öffnen Sie die CSV-Datei
df = pd.read_csv(search_words + "/" +
"mercari_scraping_" + search_words + ".csv")
# "Name"Zu"except_words"Außer denen, die enthalten
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
#Gekauft(sold=1)Nur Produkte anzeigen
dfSold = df[df["Sold"] == 1]
#Preis(Price)Zeigt nur Produkte mit einem Preis von 1500 Yen oder weniger
dfSold = dfSold[dfSold["Price"] < max_price]
#Geben Sie den Spaltennamen "Preis" "Nummer zu diesem Preis" "Prozentsatz" an.
columns = ["Price", "Num", "Percent"]
#Geben Sie den Array-Namen an
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
#Listen Sie nur die Werte zwischen MIN und MAX auf, len()Holen Sie sich die Nummer mit
df0 = dfSold[dfSold["Price"] > MIN]
df0 = df0[df0["Price"] < MAX]
sold = len(df0)
#Ich möchte es kumulativ machen, also werde ich diese Zahl zu num hinzufügen
num += sold
#Berechnen Sie hier den Prozentsatz
percent = num / all_num * 100
#Der Preis ist der Medianwert von MIN und MAX
price = (MIN + MAX + 1) / 2
se = pd.Series([price, num, percent], columns)
dfPercent = dfPercent.append(se, columns)
#In CSV speichern
filename = "mercari_histgram_" + search_words + ".csv"
dfPercent.to_csv(search_words + "/" + filename, encoding="utf-8-sig")
#Zeichnen eines Diagramms
"""
:param kind:Geben Sie den Diagrammtyp an
:param y:Geben Sie den Wert der y-Achse an
:param bins:Geben Sie die Diagrammbreite an
:param alpha:Diagrammtransparenz(0:Transparent~ 1:Dunkel)
:param figsize:Geben Sie die Größe des Diagramms an
:param color:Diagrammfarbe
:param secondary_y:Spezifikation der 2-Achsen-Verwendung(Wenn wahr)
"""
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():
#Lesen Sie die CSV-Datei der Mercari-Suchliste
with open("mercari_search.csv", encoding="utf-8") as f:
#Bereiten Sie eine leere Liste zum Speichern von Suchwörtern vor
csv_lists = []
#Zähler, um zu überprüfen, welche Zeile der CSV-Datei gelesen werden soll
counter = 0
#Lesen Sie die CSV-Datei Zeile für Zeile
reader = csv.reader(f)
for row in reader:
counter += 1
csv_lists.append(row)
try:
#Suche nach Wörtern
#Wenn leer, wird eine Fehlermeldung angezeigt und beendet
if(len(row[0]) == 0):
print("File Error:Kein Suchwort-> " +
"mercari_search.csv " + str(counter) + "Linie")
break
except IndexError:
#Wenn die Zeile leer ist, zeigen Sie eine Fehlermeldung an und beenden Sie das Programm
print("File Error:Es liegt ein Problem mit der CSV-Datei vor. Bitte schließen Sie den Zeilenabstand.")
break
try:
if(len(row[2]) == 0):
#Überprüfen Sie den höchsten Wert beim Zeichnen eines Diagramms
#Wenn leer, wird eine Fehlermeldung angezeigt und beendet
print("File Error:Es wurde kein Betrag festgelegt-> " +
"mercari_search.csv " + str(counter) + "Linie")
break
else:
try:
int(row[2])
except ValueError:
#Wenn der Wert nicht angezeigt wird, wird eine Fehlermeldung angezeigt und der Vorgang beendet.
print("File Error:Bitte geben Sie eine Nummer für den Betrag ein-> " +
"mercari_search.csv " + str(counter) + "Linie")
break
except IndexError:
#Wenn der Betrag selbst nicht an erster Stelle geschrieben wird, wird eine Fehlermeldung angezeigt und der Vorgang endet.
print("File Error:Es wurde kein Betrag festgelegt-> " +
"mercari_search.csv " + str(counter) + "Linie")
break
try:
if(len(row[3]) == 0):
#Überprüfen Sie den höchsten Wert beim Zeichnen eines Diagramms
#Wenn leer, wird eine Fehlermeldung angezeigt und beendet
print("File Error:Die Diagrammbreite ist nicht festgelegt-> " +
"mercari_search.csv " + str(counter) + "Linie")
break
else:
try:
int(row[3])
except ValueError:
#Wenn der Wert nicht angezeigt wird, wird eine Fehlermeldung angezeigt und der Vorgang beendet.
print("File Error:Bitte geben Sie eine Zahl für die Grafikbreite ein->" +
"mercari_search.csv " + str(counter) + "Linie")
break
except IndexError:
#Wenn der Betrag selbst nicht an erster Stelle geschrieben wird, wird eine Fehlermeldung angezeigt und der Vorgang endet.
print("File Error:Die Diagrammbreite ist nicht festgelegt-> " +
"mercari_search.csv " + str(counter) + "Linie")
break
return csv_lists
# ------------------------------------------------------ #
# 0.Bereiten Sie ein Feld zum Speichern der aus der Mercari-Such-CSV-Datei gelesenen Liste vor
"""
Lesen Sie die Liste aus der CSV-Suchdatei
:param csv_lists[i][0]:Suchbegriff
:param csv_lists[i][1]:Wörter, die aus den Suchergebnissen ausgeschlossen werden sollen
:param csv_lists[i][2]:Maximaler Betrag beim Anzeigen eines Diagramms
:param csv_lists[i][3]:Diagrammbreite(bin)
"""
csv_lists = read_csv()
#Stapelverarbeitung
for i in range(len(csv_lists)):
# 1.Verzeichnis erstellen
os.mkdir(csv_lists[i][0])
# 2.Kratzprozess
search_mercari(csv_lists[i][0])
# 3.Diagrammzeichnung
make_graph(csv_lists[i][0], csv_lists[i][1],
int(csv_lists[i][2]), int(csv_lists[i][3]))
Geben Sie die Wörter, die Sie suchen möchten, die Wörter, die Sie ausschließen möchten, die maximale Menge und die Diagrammbreite in mercari_search.csv ein.
Wenn Sie jedes Wort trennen, handelt es sich um eine CSV-Datei. Trennen Sie sie daher durch ein Komma (,).
Beispiel:
Uhr,Digital,10000,100
Brieftasche,Kuh,3000,100
Pokémon_Spiel,Karte_CD,3000,100
Computer,,15000,500
Stellen Sie sicher, dass sich "chromedriver.exe" und "mercari_search.py" im selben Verzeichnis wie diese Quelldatei ("Scraping_batch.py") befinden, und führen Sie den folgenden Befehl aus.
python scraping_batch.py
Während der Ausführung wird die Anzahl der abgekratzten Seiten wie unten gezeigt angezeigt.
1 Seite wird erfasst
Moving to next page ...
2 Seiten bekommen
Moving to next page ...
3 Seiten erwerben
・ ・ ・
22 Seiten erhalten
Moving to next page ...
23 Seiten werden erworben
Next page is nothing.
Finish!
Wenn Sie Python in 2 oben ausführen, wird ein Verzeichnis entsprechend Ihrem Suchbegriff erstellt. In diesem Verzeichnis wird als Ergebnis des Scrapings mit Mercari ein Diagramm erstellt. Überprüfen Sie daher das Ergebnis.
Wenn Sie mit den Ergebnissen nicht zufrieden sind, konfigurieren Sie Ihre CSV-Datei neu und versuchen Sie es erneut!
Das gleiche Verzeichnis wie das Suchwort wird im gleichen Verzeichnis wie die Python-Datei erstellt (um zu verhindern, dass eine große Anzahl von Dateien in dem Verzeichnis erstellt wird, in dem die Python-Datei vorhanden ist). Wenn dasselbe Verzeichnis wie das Suchwort bereits vorhanden ist oder wenn dasselbe Suchwort in der Such-CSV ("mercari_search.csv") vorhanden ist, funktioniert das Erstellen des Verzeichnisses ("os.mkdir ()") nicht ordnungsgemäß. Das Schaben hört in der Mitte auf. Achten Sie daher beim Scraping darauf, dass nicht dasselbe Verzeichnis wie das Suchwort vorhanden ist und dass Sie nicht dasselbe Suchwort in die CSV-Datei eingeben.
Eigentlich habe ich versucht, mit dem Produkt "Linga Metallica" (englisches Wortbuch, das Fachleuten bekannt ist) zu kratzen, das derzeit zum Verkauf steht. Die während der Suche verwendeten Wörter und Parameter lauten wie folgt. (Da ich den Hauptteil von Ringa Metallicas Wortbuch verkaufen möchte, versuche ich, diejenigen auszuschließen, deren Suchwort das Wort "CD" enthält.) "Linga Metallica, CD, 1500, 50" Durch Drehen der obigen Quelle wird das folgende Diagramm erstellt. Betrachtet man das,
Das Ergebnis war das. Aus dieser Grafik können Sie ersehen, dass etwa 600 Yen ein angemessener Preis sind, wenn Sie "Ringa Metallica" verkaufen möchten.
Zum Zeitpunkt des Schreibens dieses Artikels habe ich versucht, "Linga Metallica" ohne "merkliche Kratzer oder Flecken" zu verkaufen. Zu dieser Zeit betrug der von Mercari angebotene Marktpreis "640 Yen" (der leicht zu verkaufende Preis betrug 460 bis 790 Yen).
Vielleicht bot die Mercari-Seite einen angemessenen Betrag an, ohne selbst kratzen und nachsehen zu müssen. .. ..
Momentan denke ich über fünf Dinge nach: Ich würde es gerne tun, auch wenn ich in Zukunft langsam Zeit habe.
――Da Produkte auf anderen Frima-Websites aufgeführt sind, möchte ich das gleiche Scraping wie oben verwenden, um Informationen zum Produktverkauf zu erhalten. ――Ich denke, dass sich der Wert des Produkts je nach Erscheinungsdatum und Saison ändern wird. Daher möchte ich die Preise nach Zeitreihen und Saison klassifizieren. ――Der Preis ändert sich je nach Zustand des Produkts, daher möchte ich den "Zustand des Produkts" als Element streichen.
Das ist alles für diese Zeit. Bis zum Ende Danke fürs Lesen.
kewpie134134/fleamarket_app_scraping
Recommended Posts