2018/06/07

【Python】Twitter「モーメント」から画像を一括でDLするスクレイピング・スクリプトを書いた

はい.

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 件のコメント:

コメントを投稿