◎前置き
やあ皆、Pixiv使ってるかい?OKOK、当然使っているだろう、そんなことは分かっている
絵を見るのに使うだろうし、文章を見るのに使うだろうし、人によっては作品を投稿するのに使っているだろう
勿論他の対抗サイトも数々現れたし、Pixiv自身のやらかした不始末などで離れた人も多数いるが、そんなことはお構いなしに今も二次創作投稿場所としては最大勢力を誇るPixiv君だ(小説のジャンル等によってはそうでもない可能性があるがここでは取り上げないこととする、例:東方のそそわ、ラSS板等)
それがいいことか悪いことなのかはさておいて、見るだけの側にしてみれば一つのサイトに集まってると何かと便利である、検索とか検索とか検索とか
おじいちゃん、CG定点観測の更新の時間よ…
おばあちゃん、SS-Linksが更新されたわ…
老師、またArcadiaが鯖壊れてる…
なーんて時代はとっくの昔に終わったのだ
いや、もはやツイッターの方がアップにしろ情報にしろ早いとか言わないでくれ、頼む、そんなことは百も承知だ
(PAWOO!の有効活用の仕方がいまいちよくわからない、誰か教えて欲しい)
Pixivは大変便利である、勿論Pixivのみがすべてではないのは確かなのだが、Pixivという場所にたくさんのデータがそろっているので大変重宝する
データ
そう、データが豊富なのだ
ジャンルの傾向やキャラ人気の勢いなどを測るのに大変貴重なのである
勿論、Pixivがすべてでは決してない、しかし明確な数値が出るのが大変貴重なのだ
(そういう意味ではツイッター等での発言数なども一種のデータではあるが、同一発言を連呼したり特定の画像を貼り付け続けるBOTやBOT以下の存在等のせいでほとんど意味を成していない、辛い、それらを取り除けることはできるだろうが)
しかしここでPixivには大いに欠点があったのだ…!
それは何か
◎前提
PixivはAPIを公開していないAPI
API…?
アプリケーションプログラミングインタフェース(API、英: Application Programming Interface)とは、ソフトウェアコンポーネントが互いにやりとりするのに使用するインタフェースの仕様である。
うーん、Wiki先生の丸コピペ!!
まあ大体上記のとおりである、大丈夫、私も分かっていないから大丈夫、安心してついてきてくれ
まあ大雑把に言えば「PixivのAPI」というのは「Pixivの仕様」みたいなもんである
それが公開されていると、外部ソフト…つまり有志のソフトウェアがぐっと開発しやすくなるのだ、OK?
それがあればデータ解析ソフトとか見やすいビューワーを作ってくれる人が現れたりして、めっちゃ便利になる…のだが…
残念なことに公開されていない
もっと恐ろしいことに、解析されていったん色々作られていこうとしてたんだけど、Pixivは無言でAPIの仕様を変更した
いや、そりゃ別に公開してないんだから無言で変更していいんだ、Pixiv側はむしろ自衛のために行ったんだが…(簡単に言ってしまえば、APIを公開したりすると恐らく自動で画像を大量クローリングするソフトが横行して鯖が死ぬ、他にも多数の問題が発生して死ぬ可能性が高い)
(どっちみち過度なアクセスは規約違反なのでね、しょうがないね)
とにかくこの影響により解析ソフトなどは発達していない
Pixiv自身がデータ解析ソフトを作ってくれたらいいんだが、多分リバースエンジニアリング(つまりソフトの形状から遡って仕様を推測されてしまうこと)されて速攻でえらいことになるからやっぱだめなんだろう
しかし私はどうしてもデータが欲しかった
過去にAPIを叩いて遊んでた人たちがいることを知っている、東方における久樹先生とかもその一人だったはずだ
彼らが現在いかにしてデータを拾い集めてるのかよくわからんちん状態でお手上げだったのだが(以前何かの発言で公開していた記憶があるのだが…)、まあ検索してみると同じような事を考える人間というのは当然いるわけで
https://tsubasa.me/tech/app/pixiv-for-python
やったぜ、これさえあればできるやんけ!!
~完~
~再~
いや、いやいや、できるのはいいんだが、そもそもpythonってなんぞや…?
pythonを分かってる人は上記のページを見たらもう用事はないです
ここから先は全くプログラムをかじった事のない人間がpythonというものに立ち向かった記録です
(実際はpythonの存在は知っていたし、プログラム自体は初歩のjavaで躓いて以来ほとんどやったことないけどアルゴリズムとかはほんの少しだけ理解してる)
素人のやったことなので多目に見てください
後、間違ったことが書いてあるかも…
違う
間違ったことばかり書いてあるのだろう
pythonを使ってプログラムを自由に作成できるようになりたいのではない
上記のプログラムさえ自由に動かせるようになればよかろうなのだー!!
ちなみにWindowsマシンでの作業となる(後に問題となる)
お前は一体なんなんだ
なんかサイモンっていいそうになる、サイモン&ガーファンクル
実際はパイソン、かのモンティパイソンからお名前を頂戴したそうだ、存在がふざけているということなのか(違う
というわけでこの記事のタイトルも「まさかの時のスペイン宗教裁判」なのである
こいつはプログラミング言語だそうだ
ふーん
よくわからん、Wikiがあるじゃろ
http://www.tohoho-web.com/python/
python入門
どうやらなんかインストールせねばならんらしい
早速公式HPっぽいところへ行ってインストールする…英語で分からん、日本語もあったんだがなぜか最初英語に行ってしまった
「Python 2.7系とPython 3.5系でサポートしています。」って上のサイトで書いてあったから2.7か3.5を入れたらええんやなって思ってみてみたら
2.7と3.6がある…新しいの入れたいけど、こいつ3.6で動くかわかんねぇ
しゃーねー、2.7にしとくか(結果的に間違いだったことが後で発覚)
DLしてきてインストール
インストールの際の注意として「環境変数 Path に python コマンドへのパスを追加する」とかいう意味不明なことを言われている
http://qiita.com/taipon_rock/items/f574dd2cddf8851fb02c
ここを参考にすればいい、というかインストールの途中でチェックを入れるだけである
インストールは出来た、しかしここからが問題である…
こちらのサイトにあるようにライブラリの入手というのをやらねばならないらしい
ライブラリとはなんぞや、という疑問はおいておいてDLしたいのだが…
GitHubというところに公開されているんだな、というのは分かる
(実際はGitHubの存在は一応知っている、知り合いのプログラムできる人がたまにしゃべっているから)
書いてあるとおりgit cloneというコマンドを使えば、これ取れるのかな…?
書いてあるとおりに打ち込む(コピペしてもよかった)、Enter押す
Error!
???????
???????
えぇ…どういうことなの
よくわからないのでGitHubのページに飛んで直接ファイルをDLすることに
しかしこのライブラリというやつDLしたのはいいんだがこれどうやって使うんだ?
パッケージ、モジュール、よくわからない言葉が飛び交う
落としてきたものを入れるにはsetup.pyというやつが必要なのか、何がなんだか分からない…
とりあえず落としてきた奴をpythonのフォルダに突っ込んでみて、サイトに書いてあるコマンドっぽい文字列を試してみたけどエラーばっかり吐きやがる…
「散々上で言ってんじゃねーか、当たり前だろ」、という突っ込みを入れるのをちょっと待って欲しい
pythonというプログラムをインストールしたもんだと思っていた
我々素人はプログラムというものをインストールすると何らかのボタンを押したり、何か数値やデータを入力すれば勝手に動いてくれるものだという風に思っている節がある(世の中の人に失礼
つまり、pythonってのを落としたらコマンドを打ち込めば勝手に色々やってくれんのかな~と思ってたのだ
しかしそうじゃない、プログラムを自分で書いて(もしくは誰かが書いたのをもらってきて)実行することで動作するのだということに気づいた
あ、うん、そうだよね…
当たり前だよね…
でもその当たり前に辿り着く事がほんと、大変なんだよ…
そしてモジュールとかパッケージとかライブラリとかいうのはプログラムを書く際に、ある程度よく使うやつを先に書いて作ってくれてるということになる(少々この表現には語弊があるのだが
最初git cloneというのを必死こいて打っても動かなかったのはgitなるものを入れてなかったからだ
ないものを動かそうとしたって動くわけがないのだ…
pip(ぐぐってください、pythonにおいて便利なライブラリをインストールするのに使うライブラリ、パッケージ?)なるものを入れたりして準備を整えていく
さらにプログラムの文字列の意味も少々勉強しておく
S氏より、ちゃんと動いたぞ、という連絡を受ける
そしてS氏から「作ったプログラムファイルと同じフォルダの中にさっきのライブラリがあったらとりあえず動く」というありがたいお言葉をいただく、なるほど
まずは目的のプログラムを書いてみよう
拡張子は「py」だ
まあ書くといっても実際はhttps://tsubasa.me/tech/app/pixiv-for-pythonに書いてあるやつをコピペして適当に弄ればいいということくらいは知っている
最初に作ったのが下記の通り
必要そうなのをコピペして組み合わせたってことです、そこらへんはセンスではなく取り扱い説明書を読み解く力があれば出来ることだ
検索ワードは、やはりこいつがいいだろう
from pixiv.auth import OAuthHandler
auth = OAuthHandler()
auth.login('ユーザーID', 'パスワード')
from pixiv.api import AppPixivAPI
aapi = AppPixivAPI(auth)
for novel in aapi.search_novel(word='ほのえり'):
print(novel) # 小説モデル
print(novel.id) # 小説ID
print(novel.title) # 小説タイトル
print(novel.tags) # タグ
break
※ユーザーIDとパスワードは、本来自分のやつを入力している
※#~の部分はコメントアウト…プログラムとは全く関係ない、説明書きなどで使う模様
おおよその説明をすると恐らくこういうことだと思われる
from A import B、というのはAというパッケージの中にあるBというモジュールを今回使いますぜという宣言である
つまりpixiv.auth(これはpixivフォルダ内のauth.pyというパッケージを示す)の中に書いてあって定義されているOAuthHandlerというモジュールを使いたいんじゃーということを言っているのだ、多分
auth = OAuthHandler() は、よく分からん、authというものを定義したっぽい
auth.login()の部分はよく分からんがまあPixivのログインに関して必要な情報を入れたということだろう、何が起こるのかはいまいちつかめない
後の方もAppPixivAPIというのを呼び出している
aapiというものを定義したようだ、ここで上で定めたauthを使っている
多分このAppPixivAPIというのがこのライブラリの核みたいなもんだと思われる…
for novel以下はいよいよデータの取り出しの部分だろう
novel in aapi.search_novel(word='ほのえり')がほのえりで小説を検索してデータを返してくれるはずだ、返すデータはnovelということになる
後はprint、でデータを文字列で表してくれるということか
ごちゃごちゃしてて頭が痛くなってきた…
さて、いざ実行
NO-ASCII
なんやねんそれは
早速検索してみる
どうやら日本語を含むプログラムを書く場合、最初に文字コードを宣言しなくてはならないらしい
「ほのえり」というワードが日本語である以上どうしようもない
めんどくさい奴やな
というわけでこうなった
# coding: utf-8
from pixiv.auth import OAuthHandler
auth = OAuthHandler()
auth.login('ユーザーID', 'パスワード')
from pixiv.api import AppPixivAPI
aapi = AppPixivAPI(auth)
for novel in aapi.search_novel(word='ほのえり'):
print(novel) # 小説モデル
print(novel.id) # 小説ID
print(novel.title) # 小説タイトル
print(novel.tags) # タグ
break
# coding: utf-8
という魔法の言葉で日本語が操れるようになる(実際はUTF-8というエンコードで書きますよという宣言)
こいつも#~なんだからプログラムとは無関係なんだが、無関係な部分で宣言したらそれでいいというのは余りよく分からない
とにかくそれでいいというのだからそれでよかろう
さて、動かしてみよう
requestsがありません
…
requestsってなんや
検索する、どうやらそういうライブラリが入っていないことが原因らしい
じゃあ入れればいいんですね
pipを利用してDL→取り込む
動かす
sixがありません
上記と同じである
pipを利用してDL→取り込む
ここまではよかった
大文字と小文字で違いが出るのは確かに分かってはいるんだが、気付かないとえらい目にあいますね
auth.pyのファイルをなんなりのエディターで開いて
109行目の
listDataという配列にデータを全部叩き込んで
with open以下の文でcsvに出力するという形をとっている
lineterminatorというのは改行関係のなんからしいのがよく分からん、これで本当にあっているのか
# coding: utf-8
from pixiv.auth import OAuthHandler
auth = OAuthHandler()
auth.login('ユーザーID', 'パスワード')
from pixiv.api import AppPixivAPI
aapi = AppPixivAPI(auth)
from pixiv.cursor import AppCursor
import csv
for novel in AppCursor(aapi.search_novel, word='ほのえり').items(20):
listData = []
listData.append(novel.id, novel.title, novel.user, novel.tags, novel.text_length, novel.total_bookmarks, novel.total_view, novel.create_date)
with open('honoeri_sjis1.csv', 'w') as csvfile:
writer = csv.writer(csvfile, lineterminator='\n')
writer.writerow(listData)
つまり最初に空のListDataを用意し、それに追加するという形で定義してやればよいのではないか…という考え
listData.append()は括弧の中のものを追加するっぽい
実行
そもそも定期的に更新するのもめんどくさいしさぁ
後、間違ったことが書いてあるかも…
違う
間違ったことばかり書いてあるのだろう
◎目的
上記のプログラムを実行できるようにするpythonを使ってプログラムを自由に作成できるようになりたいのではない
上記のプログラムさえ自由に動かせるようになればよかろうなのだー!!
ちなみにWindowsマシンでの作業となる(後に問題となる)
◎pythonとは一体…
うごごごお前は一体なんなんだ
なんかサイモンっていいそうになる、サイモン&ガーファンクル
実際はパイソン、かのモンティパイソンからお名前を頂戴したそうだ、存在がふざけているということなのか(違う
というわけでこの記事のタイトルも「まさかの時のスペイン宗教裁判」なのである
こいつはプログラミング言語だそうだ
ふーん
よくわからん、Wikiがあるじゃろ
http://www.tohoho-web.com/python/
python入門
どうやらなんかインストールせねばならんらしい
早速公式HPっぽいところへ行ってインストールする…英語で分からん、日本語もあったんだがなぜか最初英語に行ってしまった
「Python 2.7系とPython 3.5系でサポートしています。」って上のサイトで書いてあったから2.7か3.5を入れたらええんやなって思ってみてみたら
2.7と3.6がある…新しいの入れたいけど、こいつ3.6で動くかわかんねぇ
しゃーねー、2.7にしとくか(結果的に間違いだったことが後で発覚)
DLしてきてインストール
インストールの際の注意として「環境変数 Path に python コマンドへのパスを追加する」とかいう意味不明なことを言われている
http://qiita.com/taipon_rock/items/f574dd2cddf8851fb02c
ここを参考にすればいい、というかインストールの途中でチェックを入れるだけである
インストールは出来た、しかしここからが問題である…
◎わけが分からないよ
https://tsubasa.me/tech/app/pixiv-for-pythonこちらのサイトにあるようにライブラリの入手というのをやらねばならないらしい
ライブラリとはなんぞや、という疑問はおいておいてDLしたいのだが…
GitHubというところに公開されているんだな、というのは分かる
(実際はGitHubの存在は一応知っている、知り合いのプログラムできる人がたまにしゃべっているから)
書いてあるとおりgit cloneというコマンドを使えば、これ取れるのかな…?
書いてあるとおりに打ち込む(コピペしてもよかった)、Enter押す
Error!
???????
???????
えぇ…どういうことなの
よくわからないのでGitHubのページに飛んで直接ファイルをDLすることに
しかしこのライブラリというやつDLしたのはいいんだがこれどうやって使うんだ?
パッケージ、モジュール、よくわからない言葉が飛び交う
落としてきたものを入れるにはsetup.pyというやつが必要なのか、何がなんだか分からない…
とりあえず落としてきた奴をpythonのフォルダに突っ込んでみて、サイトに書いてあるコマンドっぽい文字列を試してみたけどエラーばっかり吐きやがる…
◎援軍来る
ツイッター上で「pythonを知るもの、来たれ!」と呼びかけてみたところ、ナジュの熱き血を絞ったわけでもないのに援軍(S氏)がやってきてくれた、やったー
ところが、何が分からないのかが分からない
素人がこういうときに陥る問題は、えてして、何が分からないのか分からないのだ
だから何が分からないのか聞きたくても聞くことが出来ないのである、困ったもんだ
しかし何とかこう、やりたいことを伝えたところS氏は何と自分の環境で動くか試してくれると言ってくれた、なんて親切なんだ…
◎閃き
S氏が試してくれてる間も一応色々調べてみた、具体的にはpythonってなんなのってことを
その結果ようやく理解したのだ
pythonって、プログラム言語のことなんだ…
pythonというプログラムをインストールしたもんだと思っていた
我々素人はプログラムというものをインストールすると何らかのボタンを押したり、何か数値やデータを入力すれば勝手に動いてくれるものだという風に思っている節がある(世の中の人に失礼
つまり、pythonってのを落としたらコマンドを打ち込めば勝手に色々やってくれんのかな~と思ってたのだ
しかしそうじゃない、プログラムを自分で書いて(もしくは誰かが書いたのをもらってきて)実行することで動作するのだということに気づいた
あ、うん、そうだよね…
当たり前だよね…
でもその当たり前に辿り着く事がほんと、大変なんだよ…
そしてモジュールとかパッケージとかライブラリとかいうのはプログラムを書く際に、ある程度よく使うやつを先に書いて作ってくれてるということになる(少々この表現には語弊があるのだが
最初git cloneというのを必死こいて打っても動かなかったのはgitなるものを入れてなかったからだ
ないものを動かそうとしたって動くわけがないのだ…
pip(ぐぐってください、pythonにおいて便利なライブラリをインストールするのに使うライブラリ、パッケージ?)なるものを入れたりして準備を整えていく
さらにプログラムの文字列の意味も少々勉強しておく
◎頑張りスタート
S氏より、ちゃんと動いたぞ、という連絡を受ける
そしてS氏から「作ったプログラムファイルと同じフォルダの中にさっきのライブラリがあったらとりあえず動く」というありがたいお言葉をいただく、なるほど
まずは目的のプログラムを書いてみよう
拡張子は「py」だ
まあ書くといっても実際はhttps://tsubasa.me/tech/app/pixiv-for-pythonに書いてあるやつをコピペして適当に弄ればいいということくらいは知っている
最初に作ったのが下記の通り
必要そうなのをコピペして組み合わせたってことです、そこらへんはセンスではなく取り扱い説明書を読み解く力があれば出来ることだ
検索ワードは、やはりこいつがいいだろう
from pixiv.auth import OAuthHandler
auth = OAuthHandler()
auth.login('ユーザーID', 'パスワード')
from pixiv.api import AppPixivAPI
aapi = AppPixivAPI(auth)
for novel in aapi.search_novel(word='ほのえり'):
print(novel) # 小説モデル
print(novel.id) # 小説ID
print(novel.title) # 小説タイトル
print(novel.tags) # タグ
break
※ユーザーIDとパスワードは、本来自分のやつを入力している
※#~の部分はコメントアウト…プログラムとは全く関係ない、説明書きなどで使う模様
おおよその説明をすると恐らくこういうことだと思われる
from A import B、というのはAというパッケージの中にあるBというモジュールを今回使いますぜという宣言である
つまりpixiv.auth(これはpixivフォルダ内のauth.pyというパッケージを示す)の中に書いてあって定義されているOAuthHandlerというモジュールを使いたいんじゃーということを言っているのだ、多分
auth = OAuthHandler() は、よく分からん、authというものを定義したっぽい
auth.login()の部分はよく分からんがまあPixivのログインに関して必要な情報を入れたということだろう、何が起こるのかはいまいちつかめない
後の方もAppPixivAPIというのを呼び出している
aapiというものを定義したようだ、ここで上で定めたauthを使っている
多分このAppPixivAPIというのがこのライブラリの核みたいなもんだと思われる…
for novel以下はいよいよデータの取り出しの部分だろう
novel in aapi.search_novel(word='ほのえり')がほのえりで小説を検索してデータを返してくれるはずだ、返すデータはnovelということになる
後はprint、でデータを文字列で表してくれるということか
ごちゃごちゃしてて頭が痛くなってきた…
さて、いざ実行
NO-ASCII
なんやねんそれは
早速検索してみる
どうやら日本語を含むプログラムを書く場合、最初に文字コードを宣言しなくてはならないらしい
「ほのえり」というワードが日本語である以上どうしようもない
めんどくさい奴やな
というわけでこうなった
# coding: utf-8
auth = OAuthHandler()
auth.login('ユーザーID', 'パスワード')
from pixiv.api import AppPixivAPI
aapi = AppPixivAPI(auth)
for novel in aapi.search_novel(word='ほのえり'):
print(novel) # 小説モデル
print(novel.id) # 小説ID
print(novel.title) # 小説タイトル
print(novel.tags) # タグ
break
# coding: utf-8
という魔法の言葉で日本語が操れるようになる(実際はUTF-8というエンコードで書きますよという宣言)
こいつも#~なんだからプログラムとは無関係なんだが、無関係な部分で宣言したらそれでいいというのは余りよく分からない
とにかくそれでいいというのだからそれでよかろう
さて、動かしてみよう
requestsがありません
…
requestsってなんや
検索する、どうやらそういうライブラリが入っていないことが原因らしい
じゃあ入れればいいんですね
pipを利用してDL→取り込む
動かす
sixがありません
上記と同じである
pipを利用してDL→取り込む
ここまではよかった
◎詰まる
datetime(略 のところで、Invalid format stringが出る
なんやねんこれぇ
python君は賢いので、何処でエラーが出たのかを親切に教えてくれる
今回はどうやらこんなところで出たらしい
auth.pyモジュール内の109行目
datetime.datetime.now().strftime(%s)
エラー内容はInvalid format string
はぁ、なんなんそれ
検索したところ、日時を取ってきてなんやかんやしてるみたいだ
ロケールとかが影響してるのか、と書いてあるんだがよく分からない
そもそもロケールが分からない
LC_TIMEとか言われても意味不明(実際は調べたからちっとはわかってる
S先生に泣きつく
S先生にコードとエラー画面を送って指示を待つ
なんとMacなのにわざわざWindows環境で動作確認頂いた、惚れる
待ってる間に無駄な足掻きでpythonを3.6に変えたりしてた(実は後で生きる
結果
S氏「これWindowsでの動作を想定してないっぽい」
ぎゃー!
なんてことだ、なんてことだ…
S様が、データ出したいの言って貰ったらcvsファイルにして出しますよ、という神みたいな提案をしてくれた
親切にも程がある、そんなことされても何も返せませんよ
出来ればお願いしたい…という旨を伝え、とりあえず眠りにつくこととした
◎執念
翌朝
しかし諦めていなかった
頼んでやっていただくのが心苦しいのもある
(氏がそんなに好きでないCPのデータを拾って頂くのが心苦しいという意味である)
それに、やはりやり始めたからには自分のマシンで動かせるようにしたいものだ
(最大の理由はラブライブ小説全部データ出ししたら40000件行くからファイルがどんなもんになるのか分からないので頼みづらい、やるなら自力でやるしかねぇ、である)
datetime.datetime.nowが現在日時を取ってくるのは分かった
ならなぜInvalid format stringとなるのか?
そこでInvalid format stringの方を検索してみた
よくわからん
じゃあstrftime(%s)が悪いのか?
%Sって日時に対して秒を返すんだろ?
秒を返すだけなのに何か不都合が生じるのか?
現在時刻の秒なんて何処のタイムゾーンでも一緒やろが
てかそもそもauth認証に秒なんて使うのか?認証するくせに二桁の数字…?桁が少なすぎるんちゃうか?今日日そこまでザルな認証もないやろ
あ
これ、%Sじゃなくて%sやん…大文字じゃなくて小文字やん…
大文字と小文字で違いが出るのは確かに分かってはいるんだが、気付かないとえらい目にあいますね
はい、strftimeとInvalid format stringの両方で検索すると英語のフォーラムが引っ掛かる
strftime(%s)はUNIXTIMEという時刻(19700101からの経った秒数)を返してくれるのだが、なんとこのプログラム文はWindowsでは動かないのだ…
代替品としてpython3.3以降ではtimestampというもので対応できるようになっている
そこでライブラリ内のauth.pyのファイルを書き換えることにした、中々緊張する、人の作ったプログラムを書き換えるとは
チートコードを仕込むのと一緒とはいえ
一応コピーを取ってから書き換える
auth.pyのファイルをなんなりのエディターで開いて
109行目の
self.expires = data.get('expires_in') + int(datetime.datetime.now().srtftime(%s))
これが
self.expires = data.get('expires_in') + int(datetime.datetime.now().timestamp())
こうじゃ
てなわけで、無事に動くようになってくれたのだ…
めでたしめでたし、やれやれ
◎一難去って
めでたく動いた、よし、S先生に報告だ
と思ったのだが、何か結果表示がおかしい
最新の一件しか表示されてない…わいは「ほのえり」で検索してるのになんでぇ?いっぱいあるやろ!
こいつ、欠陥か!また上田か!
S氏「breakの条件を一回で満たすからそのままだと一つしかでないでプログラム終了するよ」
そっかぁ
何を言ってるかというと、breakというのは大体プログラムを終わらせるのに使う(ループを抜けたりするのにも使ったはず)
そんで上に上げたコードを実行した場合、一つの小説のデータを吐いた時点でbreakの条件に到達するからそれだけで終わっちゃうのだ
ならbreakを消せばいいのか
S氏「安易に消したら延々探し続けてアクセス過多でアク禁になる可能性あるんで注意せよ」
お、おう…
怖い><
しかしやらねばならぬ
とりあえずは実験だ
break外して歯止めなくさ迷い続ける亡霊を作らないためにはどうすればよいのか
それは、https://tsubasa.me/tech/app/pixiv-for-pythonに書かれている
つまり最初から検索数を指定してやればよいのだ
そうすれば嫌でも止まる
ならばこの書いてある、AppCursorというものを使った形にコードを作り替えればよい
イテレータクラスってなんじゃらほい…まあよく分からないけど使えればいっか、とりあえずは
という訳で、コードをこんな風に書き換えてみた
# coding: utf-8
from pixiv.auth import OAuthHandler
auth = OAuthHandler()
auth.login('ユーザーID', 'パスワード')
from pixiv.api import AppPixivAPI
aapi = AppPixivAPI(auth)
from pixiv.cursor import AppCursor
for novel in AppCursor(aapi.search_novel, word='ほのえり').items(20):
print(novel.id) # 小説ID
print(novel.title) # 小説タイトル
print(novel.tags) # タグ
print(novel.text_length) # 文字数
print(novel.total_bookmarks) # お気に入り数
print(novel.total_view) # 閲覧数
from pixiv.auth import OAuthHandler
auth = OAuthHandler()
auth.login('ユーザーID', 'パスワード')
from pixiv.api import AppPixivAPI
aapi = AppPixivAPI(auth)
from pixiv.cursor import AppCursor
for novel in AppCursor(aapi.search_novel, word='ほのえり').items(20):
print(novel.id) # 小説ID
print(novel.title) # 小説タイトル
print(novel.tags) # タグ
print(novel.text_length) # 文字数
print(novel.total_bookmarks) # お気に入り数
print(novel.total_view) # 閲覧数
これなら20件拾ったら止まるはずだ、多分
実際に動かしてみた
無事に20件拾ってきて止まってくれた、やったぜ
◎最後の戦い
この時点である意味目的は達成したのだが、欲が出る
というか、出さざるを得ない
今の状態ではpython(てかコマンドプロンプトっぽいの)(シェルというべきか?)上にデータが出てくるが、もしコピペしてもずらずら並ぶだけである
それを並び替えるのはめんどくさいし、Excelに叩き込むとか他のソフトに入れるのもかなりめんどくさい
何とか望んだ形でファイルに出せないか?
どうやらpythonはcsvファイルを吐き出すことが出来るらしい
そのためにはcsvというライブラリを入れなければいけない
のでやっぱりpipでcsvをDLしてインストール
のでやっぱりpipでcsvをDLしてインストール
やり方を検索してみるが、何か今一よく分からない
たくさんやり方(コードの書き方)があるっぽいからだ
振り返って理想が何なのかを考える
作品タイトル、作者名、タグ、お気に入り数、閲覧数、投稿日時
みたいな形を一行としてExcelで一覧が見れれば望ましいなぁと
それを現実化させるにはどうするか、という観点から検索を再開
結果
List(配列)にデータを叩き込んでおいて、それを一度に出力させる方法がよかろうと判断
なんか何を言ってるか説明しづらい、私もあまり分かってはいないため
んで、考えた末にこう書いた
# coding: utf-8
from pixiv.auth import OAuthHandler
auth = OAuthHandler()
auth.login('ユーザーID', 'パスワード')
from pixiv.api import AppPixivAPI
aapi = AppPixivAPI(auth)
from pixiv.cursor import AppCursor
import csv
for novel in AppCursor(aapi.search_novel, word='ほのえり').items(20):
listData = [novel.id, novel.title, novel.user, novel.tags, novel.text_length, novel.total_bookmarks, novel.total_view, novel.create_date]
with open('honoeri_sjis1.csv', 'w') as csvfile:
writer = csv.writer(csvfile, lineterminator='\n')
writer.writerow(listData)
from pixiv.auth import OAuthHandler
auth = OAuthHandler()
auth.login('ユーザーID', 'パスワード')
from pixiv.api import AppPixivAPI
aapi = AppPixivAPI(auth)
from pixiv.cursor import AppCursor
import csv
for novel in AppCursor(aapi.search_novel, word='ほのえり').items(20):
listData = [novel.id, novel.title, novel.user, novel.tags, novel.text_length, novel.total_bookmarks, novel.total_view, novel.create_date]
with open('honoeri_sjis1.csv', 'w') as csvfile:
writer = csv.writer(csvfile, lineterminator='\n')
writer.writerow(listData)
listDataという配列にデータを全部叩き込んで
with open以下の文でcsvに出力するという形をとっている
lineterminatorというのは改行関係のなんからしいのがよく分からん、これで本当にあっているのか
実行
結果はあえなくerror
Listというのはどうやらそういうものではないようだ
ならこれならどうか
# coding: utf-8
from pixiv.auth import OAuthHandler
auth = OAuthHandler()
auth.login('ユーザーID', 'パスワード')
from pixiv.api import AppPixivAPI
aapi = AppPixivAPI(auth)
from pixiv.cursor import AppCursor
import csv
for novel in AppCursor(aapi.search_novel, word='ほのえり').items(20):
listData = []
listData.append(novel.id, novel.title, novel.user, novel.tags, novel.text_length, novel.total_bookmarks, novel.total_view, novel.create_date)
with open('honoeri_sjis1.csv', 'w') as csvfile:
writer = csv.writer(csvfile, lineterminator='\n')
writer.writerow(listData)
つまり最初に空のListDataを用意し、それに追加するという形で定義してやればよいのではないか…という考え
listData.append()は括弧の中のものを追加するっぽい
実行
やっぱりerror
しかし前進、なぜならlistData.append()君は8個も一度に食えないよ1個ずつ入れろ馬鹿たれというお叱りの言葉が出てきたのだ
ということは、一個ずつ追加してやればよい
なので
# coding: utf-8
from pixiv.auth import OAuthHandler
auth = OAuthHandler()
auth.login('ユーザーID', 'パスワード')
from pixiv.api import AppPixivAPI
aapi = AppPixivAPI(auth)
from pixiv.cursor import AppCursor
import csv
for novel in AppCursor(aapi.search_novel, word='ほのえり').items(20):
listData = []
listData.append(novel.id)
listData.append(novel.title)
listData.append(novel.user)
listData.append(novel.tags)
listData.append(novel.text_length)
listData.append(novel.total_bookmarks)
listData.append(novel.total_view)
listData.append(novel.create_date)
with open('honoeri.csv', 'w') as csvfile:
writer = csv.writer(csvfile, lineterminator='\n')
writer.writerow(listData)
from pixiv.auth import OAuthHandler
auth = OAuthHandler()
auth.login('ユーザーID', 'パスワード')
from pixiv.api import AppPixivAPI
aapi = AppPixivAPI(auth)
from pixiv.cursor import AppCursor
import csv
for novel in AppCursor(aapi.search_novel, word='ほのえり').items(20):
listData = []
listData.append(novel.id)
listData.append(novel.title)
listData.append(novel.user)
listData.append(novel.tags)
listData.append(novel.text_length)
listData.append(novel.total_bookmarks)
listData.append(novel.total_view)
listData.append(novel.create_date)
with open('honoeri.csv', 'w') as csvfile:
writer = csv.writer(csvfile, lineterminator='\n')
writer.writerow(listData)
こうした
無事にファイルに書き込みが行われた、やったぜ
一行…んんんんん?
なぜ、一行
考えた結果、コードの並び順に問題があることに気付く
現状だとfor novel in AppCursor()が先に20回実行される、そして20回実行されるのはいいが最後に残るデータは最後に検索した20番目のデータだけなのだ(novelデータが検索ヒットごとに常に上書きされていくため)
ということはlistDataの中身もそのつど書き直されてしまう
その後にいくら書き出しても当然最後に残ったlistDataの一個一行しか出てきませんわな
というかこれだと書き出し命令は1回こっきりしかできてない
というかこれだと書き出し命令は1回こっきりしかできてない
ということは、for novel in AppCursor()の中にwriter.writerow(listData)の構文を組み合わせる必要があるわけだ、そうすれば指定した回数書き出しを行ってくれるはず
まあ、後は色々参考にできるサイトに載ってるのを真似するだけ
結果こうなった
# coding: utf-8
from pixiv.auth import OAuthHandler
auth = OAuthHandler()
auth.login('ユーザーID', 'パスワード')
from pixiv.api import AppPixivAPI
aapi = AppPixivAPI(auth)
from pixiv.cursor import AppCursor
import csv
# この部分は別にいりません
for novel in AppCursor(aapi.search_novel, word='ほのえり').items(20):
print(novel.id) # 小説ID
print(novel.title) # 小説タイトル
print(novel.user) # 投稿者詳細
print(novel.tags) # タグ
print(novel.text_length) # 文字数
print(novel.total_bookmarks) # お気に入り数
print(novel.total_view) # 閲覧数
print(novel.create_date) # 投稿日時
# この部分は別にいりません
with open('CSVファイル名.csv', 'w') as csvfile:
writer = csv.writer(csvfile, lineterminator='\n')
for novel in AppCursor(aapi.search_novel, word='検索したい単語').items(20):
listData = []
listData.append(novel.id)
listData.append(novel.title)
listData.append(novel.user)
listData.append(novel.tags)
listData.append(novel.text_length)
listData.append(novel.total_bookmarks)
listData.append(novel.total_view)
listData.append(novel.create_date)
writer.writerow(listData)
from pixiv.auth import OAuthHandler
auth = OAuthHandler()
auth.login('ユーザーID', 'パスワード')
from pixiv.api import AppPixivAPI
aapi = AppPixivAPI(auth)
from pixiv.cursor import AppCursor
import csv
# この部分は別にいりません
for novel in AppCursor(aapi.search_novel, word='ほのえり').items(20):
print(novel.id) # 小説ID
print(novel.title) # 小説タイトル
print(novel.user) # 投稿者詳細
print(novel.tags) # タグ
print(novel.text_length) # 文字数
print(novel.total_bookmarks) # お気に入り数
print(novel.total_view) # 閲覧数
print(novel.create_date) # 投稿日時
# この部分は別にいりません
with open('CSVファイル名.csv', 'w') as csvfile:
writer = csv.writer(csvfile, lineterminator='\n')
for novel in AppCursor(aapi.search_novel, word='検索したい単語').items(20):
listData = []
listData.append(novel.id)
listData.append(novel.title)
listData.append(novel.user)
listData.append(novel.tags)
listData.append(novel.text_length)
listData.append(novel.total_bookmarks)
listData.append(novel.total_view)
listData.append(novel.create_date)
writer.writerow(listData)
これにて、無事に20行のデータをcsvファイルに出力することが可能になった、長かった
素人ががんばったなりにはそれなりの成果ではないだろうか
もしこれを参考にする方がいらしたなら、まあ自分の欲しいデータを考えていろいろ工夫したらよいかと思います
novelデータを一回参考に1つ出してみて、それの中のどれが何を指し示しているのかというのを確認したら分かるかと思うんで
いいねの数が取れるのかはよく分かってない、あれ最近変わったからなぁ
とにかく上のコードで動くことは動く、過程や方法やスパゲッティなどどうでもよかろうなのだー!
目的だけを達成したいならこれを丸コピペしてがんばってくれ
もしこれを参考にする方がいらしたなら、まあ自分の欲しいデータを考えていろいろ工夫したらよいかと思います
novelデータを一回参考に1つ出してみて、それの中のどれが何を指し示しているのかというのを確認したら分かるかと思うんで
いいねの数が取れるのかはよく分かってない、あれ最近変わったからなぁ
とにかく上のコードで動くことは動く、過程や方法やスパゲッティなどどうでもよかろうなのだー!
目的だけを達成したいならこれを丸コピペしてがんばってくれ
◎完走した感想
中々プログラムというものは楽しい
勿論自分で書く力は全く身に付いていないのだが、なぜこの文章でこういう動きになるのかということを論理的に考えていく一種のパズルとして捉えると面白いということである
また出来合いのモジュールやライブラリといったパーツを駆使して自分のやりたいことを実現するのもまたパズルであろう
そういう意味では有意義な体験であった
でも目的はそこじゃねぇんでぇ…
S氏には本当に感謝、いつもエアリプにつきあっていただき感謝、今回初めて直リプしました、いつかほのまきSS書きます、いつか
S氏には本当に感謝、いつもエアリプにつきあっていただき感謝、今回初めて直リプしました、いつかほのまきSS書きます、いつか
◎今後
データを基に遊ぶ予定
まあ、何が出来るのかな…
全く分からないが色々出来そうではある
CPごとの閲覧平均数、★の数
同一作者のCPタグの相関
時期ごとの作品投稿数の鄒勢(各種イベントエポックを加えたらなおよし
CPタグ以外のタグの動向
シリーズものの動向とかもできなかない
私個人では余り思い付かないことも多いのでご意見お待ちしてます
あ、今のところ小説のデータだけを予定
データベース化を目論んでる
DBの知識はないんだが…SQL文の知識はちょっぴりある
やってみようかな、結局勉強が必要
全体的なDBを公開するのは多分不味い、理由は人気順検索というpixivプレミアムの売りの一つ(やめてほしい)を潰すことになるからだ
まあそもそもDBで見るより明らかにpixivのサイトで検索して見た方が楽やろと言う意見はあるのだが、それでも多分何か言われたら怒られるのも悪いのもこっちだ、やめておく
(冷静に考えたらお気に入りの数を削除した形で出すのなら怒られないかもしれない)
(冷静に考えたらお気に入りの数を削除した形で出すのなら怒られないかもしれない)
そもそも定期的に更新するのもめんどくさいしさぁ
あくまである時点でのデータを取る、という形で行くべきでしょう
◎最後に
これを用いてアクセス過多でアク禁になっても責任はとらないです
pixivのAPIがまた変更になったら使い物にならなくなると思われます(20170614時点で使用可能なだけ
分からんけど
ツインポンポンの人に敬礼
https://tsubasa.me/tech/app/pixiv-for-python
ツイッターなどを探してみたが分からなかった
何かこう、誰かがこの件に関して質問とかしてたらそれを参考にしたかったんだけど…(自分で聞く勇気はもともとなかった)
https://tsubasa.me/tech/app/pixiv-for-python
ツイッターなどを探してみたが分からなかった
何かこう、誰かがこの件に関して質問とかしてたらそれを参考にしたかったんだけど…(自分で聞く勇気はもともとなかった)
0 件のコメント:
コメントを投稿