数ある記事の中からご覧頂きありがとうございます!
今回は私が趣味でスクレイピングしていた「Instagram」でつまずいたところを皆さんに共有しようと思います。
≪実行環境≫
・Windows10 pro
・Python3.6.3
・Pycharm2020-3
・Chrome driver 最新バージョン
・Google Chormeブラウザー
・Chromedriver オプションでモバイルモードにしています
1.Instagramにログインする際の注意事項
まずInstagramをスクレイピングする際にはinstagramにログインする必要があります。その際下記のような弊害が出てきます。
>>高速な処理を心がけていると入力できないとエラーが出た
これは初学者が陥りやすく、単純ですが原因解明に時間がかかることもあ ります。今までスクレイピングの経験がある方は分かるかと思いますが、 高速な処理でログインを行うとブラウザが入力処理を行う前や行ってい る途中に「ログインボタン」が押されてしまい次の処理に移れないことがあります。
〔対策〕
入力やクリック処理の前には必ず「time.sleep(1)」と入れるとこういったバグはなくなります。これは1秒間待機するという意味です。よく使うので必ず覚えておきましょう。
〔例〕
※あくまで例文なのでインスタグラムで使用はできません。
import time
from selenium import webdriver
~省略~
driver.find_element_by_id("username").send_keys(”ログインID”)
time.sleep(1)
driver.find_element_by_id("password").send_keys(”パスワード”)
time.sleep(1)
driver.find_element_by_class_name("send").click()
2.インスタの投稿ボタンの要素が出てこない
ログイン出来たら次は自動で投稿したいところ!
なんて思っていたら、投稿ボタンが現れず...
そんな時に表示させる裏技があります。
driver.refresh()
と入力してください。
これはブラウザの更新処理です。
ブラウザの更新を行うことによって
PC用からスマホ用として表示されます。
3.Chromeのウィンドウサイズによるエラー
要素の特定をXpathなどで行っている人が陥りやすいエラーです。
要素の特定作業をブラウザの最大サイズで行うとします。
実行するとSeleniumではブラウザが中途半端な大きさで起動する為
Webページの要素の配置が変わることがあり、そのせいで要素の特定に失敗することがあります。
解決策としては予めブラウザを起動させる際にMAXサイズに変更
driver.maximize_window()
このように入力するとブラウザが最大化されます。
4.フォロー中やフォロワーの閲覧で、スクロールを行い要素を増やす
フォロワーやフォロー中のアカウントを取得したい場合の方法です。
instagramの場合、フォロー中やフォロワーはスクロールして読み込んだ分だけ表示するようです。
つまりフォロー中が100人いたとしても要素を取得しようとすると20件しか取得できないことがあると思います。
その理由がこれです。
フォロー中やフォロワーはスクロールして読み込んだ分だけ表示する
ではどのようにして取得するのか。
方法は簡単です。
まず「アカウント要素」を読み込めるだけ読み込みます。
方法としてはこんな感じです。
# フォロ中を確認するためクリック
driver.find_elements_by_css_selector(".LH36I")[2].click()
# くるくるカウント
kuru_count = 0
# ###############フォローの要素確認################
# すべての要素を読み込む
while True:
# スクロール終了分岐条件
if kuru_count == 1:
label1["text"] = "ステータス:スクロール終了"
break
# ページ最下部まで行く
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# ロード時のくるくるが表示されているうちは続けさせる。 くるくるが表示されなくなってから4秒たったらブレイクさせる
if driver.find_elements_by_css_selector(".Igw0E.IwRSH.YBx95._4EzTm._9qQ0O.ZUqME"):
pass
else:
for i in range(3):
print(i)
if driver.find_elements_by_css_selector(".Igw0E.IwRSH.YBx95._4EzTm._9qQ0O.ZUqME"):
pass
else:
# ページ最下部まで行く
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
if i == 2:
kuru_count += 1
break
print("フォロー周回終了")
【説明】
kuru_count(くるくる)というのはページ最下部まで行くとロード時に表示される要素のことです。一瞬しか表示されませんが、まれに長く表示されており単にtime.sleepを行ってもスクロールできないエラーが起きます。
最終的に「くるくる」が表示されなくなったらwhileTrueから抜けます。
そして次の工程です。次はすべての要素の特定です。
# ユーザー数を取得
user_len = len(driver.find_elements_by_css_selector(".FPmhX.notranslate._0imsa"))
# 先に取得したユーザー数の分forを走らせる
userID = set([])
for i in range(user_len):
print(f'取得:{i+1}人目')
userID.add(driver.find_elements_by_css_selector(".FPmhX.notranslate._0imsa")[i].text)
これでuserIDというset型にフォロー中のアカウントIDが入りました。
このように最初にすべての要素を表示させ、表示が完了したらすべての要素を取得する方法があります。ぜひ参考にしてください。
5.ハッシュタグでヒットした情報を取得するノウハウ
ハッシュタグで調べたい情報を絞り込む場合、スマホ用ブラウザではなくPC用ブラウザとして読み込みます。
インスタのハッシュタグ検索ではスクロールするたびに要素の数が古いものから最新のものに変わり要素が増減する為、取得方法を考える必要があります。
独自で調べた結果、要素の増減を気にする必要がない方法をひとつ見つけました。方法としては、最新の投稿の1番目をクリックしそこから次の投稿へ進むボタンを押すと要素の増減を気にすることなく取得が可能でした。
# 人気の投稿を飛ばして最新の投稿の1番目をクリック
driver.find_elements_by_class_name("_9AhH0")[10].click()
while True:
taiki = 0
# 要素が表示されるまで待機
while True:
if driver.find_elements_by_css_selector(".jdnLC"):
taiki += 1
else:
break
# 10秒立ったら次ページ
if taiki == 20:
driver.find_element_by_class_name('coreSpriteRightPaginationArrow').click()
time.sleep(0.5)
# 要素が表示されたので取得したいものを取得する
#ここに取得処理を書き込む
# 取得処理はここで終了
# 次のページへ
if driver.find_elements_by_class_name('coreSpriteRightPaginationArrow'):
driver.find_element_by_class_name('coreSpriteRightPaginationArrow').click()
time.sleep(random.randint(1, 2))
この方法で要素の増減を気にせず要素を取得していけます。
宜しければ参考にしてください。
今回の記事は以上になります!!
初めてのブログで乱文でしたが最後まで読んでいただけてうれしいです。
ありがとうございました。