自分でやる、PythonでPixivアニメーションダウンローダーを実装する(アナログログインプロセス付き)



Do It Yourself Implement Pixiv Animation Downloader Python



Pステーションで見栄えの良いGIFが表示されたのに、直接ダウンロードできない場合、プログラムとして何をすればよいですか?

もちろん、ホイールを作るために繰り返されます(取り消し線が引かれています)



もちろん、私は自分でモバイルダウンローダーを作成しました!


古いルールでは、最初にGIFリクエスト情報を分析します。 Chrome-F12-Networkページを起動した後、GIFページを更新し、すべてのリクエストを確認すると、詳細についてugoira_metaというパケットが表示されます。



zipファイルのURLの値を持つoriginalSrcというプロパティを表示できます。

フレームフィールドを展開します。



これがアニメーションのフレーム情報であることがわかります。

このコードを使用して、originalSrcフィールドに表示されるzipファイルをダウンロードします。

ua = 'Mozilla/5.0 (Windows NT 10.0 Win64 x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36' cookie = 'testcookie' referer = 'https://www.pixiv.net/member_illust.php?mode=medium&illust_id=74512123' zip_url = 'https://i.pximg.net/img-zip-ugoira/img/2019/05/02/14/18/59/74512123_ugoira1920x1080.zip' headers = { 'user-agent' : ua, 'cookie' : cookie, 'referer' : referer, } response = requests.get(url,headers=headers) with open('test.zip','wb+') as fp : fp.write(response.content)

実行後、test.zipという名前の圧縮ファイルがスクリプトディレクトリに生成されます。解凍後、6桁の順序で名前が付けられたjpgファイルが表示されます(フレームフィールドと1対1で対応)。

Webページをいつでも右クリックすることによってのみ、個別のjpgファイルを取得できます。明らかに、このWebページは静的フレームをGIFにマージするのに役立ちません。ループ内の静的フレームを表示するだけです。次に、このステップを実装する必要があります。

これまでのところ、GIFをダウンロードするプロセスは次のとおりです。

1リクエストヘッダーを作成し、ugoira_metaインターフェースにリクエストしてoriginalSrcのURLを取得します

2リクエストヘッダーを再度作成して、originalSrcZIPファイルをダウンロードします。

3 ZIPをローカルで解凍して静的フレームを取得し、framesフィールドで提供された情報を使用してGIFをマージします。

4静的フレームファイルをクリアします。

コードは次のとおりです(GIF生成ではimageioを使用します)。

from fake_useragent import UserAgent import json,requests,zipfile,os import imageio def download(pid) : file_path = str(pid) headers = {'user-agent': UserAgent().random,'cookie' : cookie} # Get gif information, extract zip url gif_info = json.loads(requests.get(self.gif_info_url.format(pid=pid), headers=headers).text) delay = [item['delay'] for item in gif_info['body']['frames']] delay = sum(delay) / len(delay) zip_url = gif_info['body']['originalSrc'] # Download Compressed Pack gif_data = requests.get(zip_url, headers=headers) gif_data = gif_data.content try: os.mkdir(file_path) except Exception: pass zip_path = os.path.join(file_path, 'temp.zip') with open(zip_path, 'wb+') as fp: fp.write(gif_data) # temp_file_list = [] zipo = zipfile.ZipFile(zip_path, 'r') for file in zipo.namelist(): temp_file_list.append(os.path.join(file_path, file)) zipo.extract(file, file_path) zipo.close() # Read all static images, synthetic gif image_data = [] for file in temp_file_list: image_data.append(imageio.imread(file)) imageio.mimsave(os.path.join(file_path, str(pid) + '.gif'), image_data, 'GIF', duration=delay / 1000) # Clear all intermediate files. for file in temp_file_list: os.remove(file) os.remove(zip_path)

クッキーについて:

実際、Pステーションのクロール防止メカニズムは非常に単純で、Cookieとリファラーの2つのポイントしかありません。

リファラーとは、Pixivがページ内の各リクエストのリファラーアドレスを確認することを意味します。ページ内のリクエストは、対応するページ(上記でダウンロードしたzipファイルなど)から送信する必要があるため、リクエストにリファラー情報を含める必要があります。

Cookieを説明する必要はありません。シミュレートされたログインを実行し、Cookieを保存するだけです。

Pステーションのログイン要求を分析します。

Pixiv_id&password:アカウントパスワード

ソース:ログインプラットフォーム識別子

参照:クライミング防止識別子

Return_to:ログイン後にジャンプするページ。

そして、これはなぜpost_key ...

ソースコードに直接ctrl + fが表示され、暗号化されていなくてもソースコードに直接書き込まれますが、アクセスするたびにランダムに生成されます。

(サードパーティのガジェットの開発に非常に協力的であると言えます)

この時点で、シミュレーションログインプロセスが取得されます。

1ログインページにアクセスし、post_keyを抽出します

2POSTリクエストを介してアカウントパスワードを送信します

3クッキーを保存します

コードは次のとおりです。

login_post_url = 'https://accounts.pixiv.net/api/login?lang=zh' login_data_url = 'https://accounts.pixiv.net/login?lang=zh&source=pc&view_type=page&ref=wwwtop_accounts_index' session = requests.session() data = session.get(url=login_data_url, headers=self.headers).content.decode('utf8') post_key = bs4.BeautifulSoup(data, 'lxml').find(attrs={'name': 'post_key'})['value'] login_data = { 'pixiv_id': PIXIV_ID, 'password': PASSWORD, 'post_key': post_key, 'source': 'pc', 'ref': 'wwwtop_accounts_index', 'return_to': 'https://www.pixiv.net/', } session.post(url=login_post_url, data=login_data) session.close() cookey = requests.utils.dict_from_cookiejar(session.cookies) cookie = '' for k, v in cookey.items(): cookie += k + '=' + v + ' '

クラスを作成し、自動的にログインして、開始するたびに最新のCookieを取得すると、GIFを楽しくダウンロードできます。

記事を書き始めたばかりです。ダラオを歓迎して批判し、訂正してください

詳細なコードを参照してください 私のgithub

エグゼバージョン(クリックして使用): Baiduクラウドリンク 抽出コード:y2wv

終わり。


テキスト広告時間の終わり:広州/武広エリアで爬虫類のインターンシップ/フルタイムのポジションを求め、19年の最近の卒業生、ソフトウェアテクノロジー専攻、Requests、Scrapy、Beautiful Soupなどのサードパーティライブラリに精通している、MySQLの熟練した使用、リディス。

コメントまたはroot @ xxxxxへの電子メール

この記事は知識で最初に公開されました: https://zhuanlan.zhihu.com/p/64462335