モーメントから画像落とすみたいなやつつくってくれ
— うきら (@ukiradio) 2018年6月7日
はい.
Sponsored Link
下準備
pip install requests pip install bs4
requestsでソースコードを取得し,BeautifulSoup4で取得したソースから画像URLを抜き出し,requestsで画像をダウンロードする感じ.
osも使うけどそれはデフォルトで入ってた記憶がある.
コード
import requests import bs4 import os def main(): #画像を保存するフォルダのパス folder_path = '[画像を保存したいパス]' #画像を取得するモーメントのURL url = input("画像をダウンロードしたいモーメントのURLを入力してください---->") #ソースの取得 response = requests.get(url) #responseが200番台以外の時(=エラーのとき停止させる) response.raise_for_status() #BeautifulSoupでDLしたい画像のタグだけを抜き出す soup = bs4.BeautifulSoup(response.text, 'html.parser') #モーメントツイート群を囲むdivタグを抜き出して, moment_tweets = soup.select_one('.MomentsPermalinkPage-tweets') #そこから目的の画像のクラスを指定し,抜き出す. elements = moment_tweets.select('.MomentMediaItem-entity.MomentMediaItem-entity--image') #ファイル名の番号 file_num = 1 for element in elements: #element['src']が落としたい画像のURL print(element['src']+'をダウンロードします') #画像を取得 img_response = requests.get(element['src'], stream=True) #落とす画像の拡張子を取得 ext = os.path.splitext(element['src'])[1] #ファイル名(拡張子含むを作成) filename = str(file_num) + ext #保存パスを作成 fullpath = os.path.join(folder_path, filename) #画像書き込み with open(fullpath, "wb") as f: f.write(img_response.content) file_num += 1 print('ダウンロードが完了しました.') if __name__ == '__main__': main()
解説的メモ
Twitterのモーメントというものを全然見たことがなく,どういうページなのかもよくわからない状態からはじめた.
まず最初にファボ画像一括DLのときと同様に,APIを叩けばどうにかなるのではないかと思って調べたのだが,どうもAPIがない模様.
仕方がないので力技でスクレイピングするかということでソースコードを見てみるも,動的に生成されるらしく詰んだ!と思ったのだが,requestsでURLを叩けば普通に生成後のコードが手に入った.
昔Pythonで似たようなスクレイピングをしていたときは,ソースコードを文字列として扱い,狙ったURLを正規表現で用意しておいてそれに合致する文字列を抜き出してーみたいなことをしていたのだが,BeautifulSoupというパッケージが便利だということで今回はそれをチョイス.
まずはモーメント本体のツイートだけを抜き出すために(=関連モーメントの画像を抜き出さないように)MomentsPermalinkPage-tweetsクラスのdivタグを抜き出し,その中のMomentMediaItem-entityクラス及びMomentMediaItem-entity--imageクラスが指定されているimgタグを抜き出し,そのsrc(URL)を手に入れた.
参考にしたサイト
おわりに
今回は連番のファイル名にしたが,やりようによってはモーメントのタイトルをファイル名に入れるとかもできる.
0 件のコメント:
コメントを投稿