【Python3の基本】ヤフオクの過去の落札価格の自動保存でオークション相場を分析 | Apple iOS 開発 YouTube セミナー 51


Python3系


- ヤフオクの落札価格や画像情報をPythonで収集
- BeautifulSoupやseleniumなどのライブラリを使用
- 操作方法を動画で解説します


オークション相場の自動検索によりヤフオクの過去の落札価格を解析


「以下は動画のハイライトです。」

ヤフオクの過去の落札価格や画像などの情報をPythonで情報収集します。ヤフオクのサイトへの自動ログインする方法をはじめ、プログラミングで所定の箇所にスクロールして、スクリーンショットを撮ったり、必要な画像を自動でダウンロードしたりする方法の紹介です。

まずhtmlでは以下のようにPost送信によって出先から集めたヤフオクの落札価格などのデータをiPhoneで見たりすることができます。


<form name="Form" method="POST" action="../cgi-bin/YouTube.cgi">
name: <input type="text" size="30" name="name">
<input type="submit" value="submit" name="button">
</form></body>




なお、コードの全容はセキュリティ的に危険なため、本稿ではコードの一部のみ紹介させていただきます。実際に動いている様子などは動画でご確認ください。

自分のサーバーにcrontabなどで定期的にヤフオクから情報収集したデータを集めてはデータベース化してその中からキーワード検索してiPhoneでサーバーを動かして落札相場の確認などを行うことができます。

ではまずプログラミングによりロボットでYahooへログインしてみましょう。必要なライブラリは以下です。


import logging
import time
from bs4 import BeautifulSoup
import requests
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import os.path
_dir = os.path.dirname(os.path.abspath(__file__))



サーバーからも動かすことが可能ですが、今回は汎用的にmacから動かす方法を紹介します。

Brewによりchromeドライバーをインストールする必要があります。ご自身のmacの環境に合わせてインストールしてください。


try:
driver = webdriver.Chrome()

except Exception as e:
logging.error(e)
return None

driver.get(target_url)
bs4 = BeautifulSoup(driver.page_source, "html.parser")
login_url = "https://login.yahoo.co.jp/config/login?.src=www&.done=https://auctions.yahoo.co.jp/openwatchlist/jp/show/mystatus?select=watchlist&watchclosed=0"
driver.get(login_url)
time.sleep(1)



ドライバーが使えるようになったらYahooへロボットでログインしてその内部のウォッチリストなどをスクリーンショットして画像保存するものを実装してみます。

適宜time.sleep(1)などを入れないと人間らしくないとしてバンされる可能性もあるため、大切なYahoo IDなどを使う場合は自己責任のもとお願いいたします。


driver.find_element_by_name("login").send_keys(login_id)
driver.find_element_by_name("btnNext").click()
time.sleep(1)

driver.find_element_by_name("passwd").send_keys(password)
driver.find_element_by_name("btnSubmit").click()
time.sleep(1)
driver.execute_script("window.scrollTo(0, 500);")



ログインIDやパスワードはこの箇所で入力させます。driverに既存のJava Scriptで所定の位置にスクロールさせることも可能です。

ロボットにスクリーンショットを撮らせるためには以下のコマンドを使用します。


driver.save_screenshot('testY.png')



これによりtestY.pngというスクショの画像を所定のディレクトリに保存することができます。

Driverを使い終わったら以下のコマンドで終了させることを忘れないでください。


driver.close()
driver.quit()



これをやらないとdriverがどんどん増えていってリソースを無駄に消費してしまいます。

次にヤフオクの画像を自動でダウンロードする方法となります。落札価格だけだと相場のイメージができないため画像もダウンロードするものを作ってみました。

使うライブラリは以下です。


import requests
from bs4 import BeautifulSoup
from six.moves.urllib import request
import sys
args = sys.argv
import re
import os
import pandas as pd



ポイントはBeautifulSoupで画像のあるリンクを探し出すことです。ヤフオクではこのキーになる箇所が不定期に変更されたりするので以下のコマンドがどういう風に動くかよく理解する必要があります。ヤフオクで変更された場合はちょくちょく変えてあげる必要があります。


Soup.find_all()
Soup.find
link.get



この辺りは色々実験しながら理解するのが良いと思います。


def dl_y_images():
images = []
soup = BeautifulSoup(html,"html.parser")
for link in soup.find_all("img"):
if str(link).find('https://auctions.c.yimg.jp')>0:
print(link)
src = link.get("src")

if ('jpg' in src or 'gif' in src or 'png' in src):
images.append(src)
print(src)

couCou = 1
for image in images:
if image.find("https")>-1:
re = requests.get(image)
else:
re = requests.get("https:" + image)
print('Downloading:',image)
pName = dPicName + str(couCou) + ".jpg"
with open(pName,'wb') as f:
f.write(re.content)
couCou = couCou + 1



現在、ヤフオクはimgのあるリンクに以下のURLの一部を持つ特徴があり、そこをターゲットに画像を収集しました。


https://auctions.c.yimg.jp



このような特徴はよく変更されるため、コードが使えなくなったらhtmlのソースを参照にしながら色々変更してみてください。


ソースコード入手方法はYouTubeのコメント欄に記載します。

目次へ戻る

2020年03月13日