
Photo by
mimari800
python:ジモティーで無料商品データのスクレイピング
引っ越しで要らないものがでてきた、断捨離で要らないものがあったという場合、簡単に無料で引き渡したり、受け取ったりできるサイト、ジモティーをご存知でしょうか?
ジモティーのサイトはデザインもよく、スクレイピングしなくても良さそうなんですが、スクレイピングの練習もかねて、このジモティーのサイトで無料で引き取ってほしいといわれている商品の詳細をスクレイピングしていきましょう。
おおまかな流れは以下になります。
①ジモティーのサイトへアクセス
②①のhtmlを取得
③htmlから商品データを取得
④CSVにまとめる
コード全体
from urllib.request import urlopen
from bs4 import BeautifulSoup
import pandas as pd
#対象地域を選択
location = "対象地域を入力してください"
#スクレイピングのための初期準備
df_main = pd.DataFrame(columns=["タイトル", "価格", "お気に入り数", "内容", "取引場所", "商品URL", "問い合わせURL"])
url = "https://jmty.jp/" + location + "/sale?max=0&min=0"
html = urlopen(url)
bs = BeautifulSoup(html, "html.parser")
#last_page = int(bs.find("li", {"class":"last"}).get_text())
item_box = bs.findAll("li", {"class":"p-articles-list-item"})
item_box_count = len(item_box)
#対象URLのスクレイピング
for i in range(item_box_count):
#概要データ取得
title = item_box[i].find("h2", {"class":"p-item-title"}).get_text()
price = item_box[i].find("div", {"class":"p-item-most-important"}).get_text()
favorite = item_box[i].find("span", {"class":"js_fav_user_count u-size-s"}).get_text()
#詳細データ取得
for ii in item_box[i].find("h2", {"class":"p-item-title"}).select("a"):
product_url = ii.get("href")
html_detail = urlopen(product_url)
bs_detail = BeautifulSoup(html_detail, "html.parser")
text = bs_detail.find("div", {"class":"p-article-text"}).get_text()
exchange_location = bs_detail.findAll("td", {"class":"p-article-column-value"})[2].get_text()
mail = bs_detail.find("div", {"class":"clearfix"}).select("a")[0].get("href")
data = pd.Series( [ title, price, favorite, text, exchange_location, product_url, mail ], index=df_main.columns )
df_main = df_main.append( data, ignore_index=True )
df_main.to_csv("zimoty.csv", encoding="utf-8_sig")
上記が今回作成するコード全体です。ただ、上記のコードは、1ページ限定のスクレイピングとなっています。何ページも回して、取得したい場合は、for文を使ってください。コメントアウトしているlast_page変数を回数に指定してあげれば簡単に大量データの取得が可能です。
①ジモティーのサイトへアクセス
from urllib.request import urlopen
from bs4 import BeautifulSoup
import pandas as pd
#対象地域を選択
location = "対象地域を入力してください"
#スクレイピングのための初期準備
df_main = pd.DataFrame(columns=["タイトル", "価格", "お気に入り数", "内容", "取引場所", "商品URL", "問い合わせURL"])
url = "https://jmty.jp/" + location + "/sale?max=0&min=0"
locationには、対象地域を入力してください。大阪であれば osaka
pd.DataFrameであらかじめ、データフレームとカラムを作成しておきます。
各種スクレピングデータについては、ジモティーのサイトでChromeのデベロッパーツールで確認してください。
②①のhtmlを取得
html = urlopen(url)
bs = BeautifulSoup(html, "html.parser")
#last_page = int(bs.find("li", {"class":"last"}).get_text())
item_box = bs.findAll("li", {"class":"p-articles-list-item"})
item_box_count = len(item_box)
まずは、ページ全体のhtmlを取得。
その後、各アイテムデータのhtmlを取得します。同時に各アイテムデータの個数も取得します。
③htmlから商品データを取得
#対象URLのスクレイピング
for i in range(item_box_count):
#概要データ取得
title = item_box[i].find("h2", {"class":"p-item-title"}).get_text()
price = item_box[i].find("div", {"class":"p-item-most-important"}).get_text()
favorite = item_box[i].find("span", {"class":"js_fav_user_count u-size-s"}).get_text()
#詳細データ取得
for ii in item_box[i].find("h2", {"class":"p-item-title"}).select("a"):
product_url = ii.get("href")
html_detail = urlopen(product_url)
bs_detail = BeautifulSoup(html_detail, "html.parser")
text = bs_detail.find("div", {"class":"p-article-text"}).get_text()
exchange_location = bs_detail.findAll("td", {"class":"p-article-column-value"})[2].get_text()
mail = bs_detail.find("div", {"class":"clearfix"}).select("a")[0].get("href")
data = pd.Series( [ title, price, favorite, text, exchange_location, product_url, mail ], index=df_main.columns )
df_main = df_main.append( data, ignore_index=True )
各アイテムデータの個数分繰り返します。
各詳細データについては、GoogleChromeのデベロッパーツールで確認いただければと思います。
④CSVにまとめる
df_main.to_csv("zimoty.csv", encoding="utf-8_sig")
お決まりのCSV化コードですね。