koshian2 / MosaicDeeplearningBook

モザイク除去から学ぶ 最先端のディープラーニング 質問用
18 stars 0 forks source link

OPY dataset.ipynbでのコード修正ポイント #8

Open umi-tyaahan opened 3 years ago

umi-tyaahan commented 3 years ago

楽しく学習させていただいております。 5章の演習OPY dataset.ipynbですが、いくつか変更を加えることでdatasetを作成することができました。 後続の方への参考に、修正ポイントを記載します。

修正概要

  1. pixiv(API)の仕様変更によりpixivpyでのログイン処理に変更が必要です。リフレッシュトークンが必要になります。
    • https://github.com/upbit/pixivpy
    • 上記リポジトリに書いてありますが、リフレッシュトークン取得方法には2通り方法があります。
    • Chrome Developer Consoleを利用する方法
    • Seleniumを利用する方法
    • おおまかな手順はQiitaの記事が参考になります
    • https://qiita.com/yuki_2020/items/759e639a4cecc0770758
      1. リフレッシュトークンをpixiv.jsonに追記し、google drive上のcolab data/pixiv.jsonを置き換える
      2. OPY dataset.ipynbにてpixivpyのログイン処理部分をリフレッシュトークン方式に置き換える

詳細

1. Selenium方式でのリフレッシュトークン取得

途中Chromeに人力での入力作業が必要のため、1.はローカルPC作業となります。 (seleniumに熟知すればCUIのみ(Colabのみ)で済むかもしれません…) windows10&powershell(python3)で実施

準備

pythonのライブラリインストール

一旦Seleniumの動作テスト

作業フォルダに以下のtest.pychromedriver.exeを置く

import time
from selenium import webdriver

driver = webdriver.Chrome('./chromedriver.exe')
driver.get('http://www.google.com/xhtml')
time.sleep(5)
print(driver.title)

search_box = driver.find_element_by_name('q')
search_box.send_keys('ChromeDriver')
search_box.submit()
time.sleep(5)
print(driver.title)

driver.save_screenshot('search_results.png')

driver.quit()

リフレッシュトークンの取得

pixiv_auth.pyを以下から取得し、作業フォルダに配置。

https://gist.github.com/upbit/6edda27cb1644e94183291109b8a5fde

pixivpyのテスト

以下のpixivpy-test.pyでpixivpyでのログインと動作のテスト。 メモしたリフレッシュトークンを記入しておく。

# ランキングの3位までの画像をdownloadするサンプル
import time
from pixivpy3 import *

api = AppPixivAPI()
# aapi.login("ここにユーザ名","ここにパスワード") ## 使えなくなった
api.auth(refresh_token="ここにリフレッシュトークン")
json_result = api.illust_ranking()
for illust in json_result.illusts[:3]:
    api.download(illust.image_urls.large)
    time.sleep(1)

うまくいけばランキング1位~3位の画像を取得できる。

2. pixiv.jsonの修正

OPY dataset.ipynbの途中にて、pixiv.jsonをgoogle driveに上げる手順がありますが、pixiv.jsonにリフレッシュトークンを追記します。

{
  "pixiv_id": "xxxxxxx",
  "password": "xxxxxxx",
  "refresh_token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}

3行目に追記してます。メモしたリフレッシュトークンを記載します。

3. pixivpyのログイン処理のコードを修正

2箇所修正します。

    api = AppPixivAPI()
    # api.login(pixiv["pixiv_id"], pixiv["password"]) # コメント化
    api.auth(refresh_token=pixiv["refresh_token"]) # 追記
        # セッション切れ対策に一定期間に再度ログインする
        if i % 1000 == 999:
            #api.login(pixiv["pixiv_id"], pixiv["password"]) #コメント化
            api.auth(refresh_token=pixiv["refresh_token"]) # 追記

実行結果

所要時間 6時間20分 取得ファイル 9977

実行時エラーログ(作者退会済みやhash mismatchedなど) pixivpy_error.txt

その他

koshian2 commented 3 years ago

@umi-tyaahan 報告ありがとうございます。なるほど、pixivのAPIが変わっていたんですね。URL載せても構わないので、修正済みのNotebookをいただければ置き換えます。トークンやパスワードがあるので可能でしたらで構いません。

umi-tyaahan commented 3 years ago

了解です。 確認しましたが、個人情報はpixiv.json側だったので大丈夫そうです。

google drive共有 https://colab.research.google.com/drive/1JwpSsBcvs8JOCrLID-3Q8aY_atAPPDr1?usp=sharing

koshian2 commented 3 years ago

素晴らしいです。現在のOPY dataset.ipynbにPixiv API変更対応後のNotebookを追加しておきました。 ありがとうございました!