pythonでメルカリの商品名と価格をスクレイピングしてみます。
スクレイピングの準備
pythonでスクレイピングする方法は知る限りでは、seleniumをつかうかbs4とrequestsを使う方法があります。今回は後者をつかいますのでpython構文の冒頭で。
import requests, bs4
メルカリの商品ページから商品名と価格をスクレイピングするコード
検索ワードは入力受付で最初に指定します。スクレイピングをするには、まず該当ウェブページの構造を確認する必要があります。それすらも自動化したいところですが、とりま、その技術はわたしはもちあわせておりません。あるいは単純にコードを組むのがだるいか。
以下がコードです。
import requests, bs4 def mercari(search_word, how_many_page): pagelist = [] for i in range(1, how_many_page): page = 'https://www.mercari.com/jp/search/?page={0}&keyword={1}'.format(str(i), search_word) pagelist.append(page) for page in pagelist: headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'} res = requests.get(page, headers=headers) res.raise_for_status() soup = bs4.BeautifulSoup(res.text) elems_name = soup.select('.items-box-name') elems_price = soup.select('.items-box-price') for i in range(len(elems_name)): print(elems_name[i].text) print(elems_price[i].text) search_word = input("search_word?: ") how_many_page = input("how_many_page?: ") try: how_many_page = int(how_many_page) mercari(search_word, how_many_page) except: print("you input_key not int")
このコードには商品名と何ページ分取得するかを指定できる柔軟性があります。しかしメルカリにしか使えないコードではあります。
headerは指定しないとなぜかエラーになるので指定します。
このコードは取得したものをプリントするだけなので、csvなどに落とし込みたい場合は別途コードを追加する必要があります。
「soldoutだったら」を実装
とりにくい。だるい。
import requests, bs4, re def mercari(search_word, how_many_page): pagelist = [] for i in range(1, how_many_page): page = 'https://www.mercari.com/jp/search/?page={0}&keyword={1}'.format(str(i), search_word) pagelist.append(page) with open('product.csv', 'w', encoding="utf-8") as f: f.write('name,price,elem' + "\n") for page in pagelist: headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'} res = requests.get(page, headers=headers) res.raise_for_status() soup = bs4.BeautifulSoup(res.text) elems_name = soup.select('.items-box-name') elems_price = soup.select('.items-box-price') elems_photo = soup.select('.items-box-photo') for i in range(len(elems_name)): new_elems_name = elems_name[i].text.replace(",", "") new_elems_price = elems_price[i].text.replace(",", "").replace("¥ ", "") new_elems_photo = re.search('figcaption', str(elems_photo[i].__str__)) if new_elems_photo: f.write(new_elems_name + "," + new_elems_price + "," + new_elems_photo.group(0) + "\n") else: f.write(new_elems_name + "," + new_elems_price + "," + "" + "\n") try: search_word = input("search_word?: ") how_many_page = input("how_many_page?: ") how_many_page = int(how_many_page) mercari(search_word, how_many_page) except: print("how_many_page -> you input key not int")
soldoutだったら figcaption とかいうタグがついている。とるのがくそめんどくさい。
soldoutだったら figcaption という文字がセルに入るようになっているけど、上記を参考に適当に改良すればいいんじゃない?ってかんじ。もうめんどいのでこれ以上はいじらない。
雑感
いろいろやるんだったら、もうちょっと考えないといけないかなという感じ。
コメント
上記コードを試したのですが、requests でアクセスするとなにもデータが出てこないようです。なにか特別な対応が必要でしょうか?
出てこないならクラスが変わってんじゃねえの?
この程度のコードで質問するってことはブラウザの検証もわからないのかな?
chatgptにきけ。コードとエラー貼り付けたら回答でるから