2017-11-18

【Python】SeleniumでゴリゴリFacebook認証する

FacebookにSeleniumで無理やりログイン




Facebook認証を行っているWebアプリでWebスクレイピングを行おうとした時のメモ。


Facebookにログインしないと、データがとれないので、なんとかFacebookアプリにログインする方法を考えた。


普通はAPIになんらかのPOSTリクエストをして認証するのが大半だが、Selenium一発芸しか使えないので、無理やりブラウザ操作でFacebookにログインしてみた。

ソースコード

#1 Facebookにログインするメソッド


Facebookのメールアドレスとパスワードを引数をとって、Facebookにログインする。

def facebookLogin(email, password):

#1-1 Facebookログインが求められる、Webページにアクセスする

引数にFacebookアプリログイン画面のURLを入れる

browser.get("ログインしたいFacebookアプリのURL")

#1-2 フォームにE-mailとパスワードを入れる


.find_element_by_css_selectorで、引数に入力したいフォームのIDを指定する。
send_keysの引数には、もともと入れていたemailアドレスが入力される。同様にパスワードも。

    #1-2 値の入力

    browser.find_element_by_css_selector("#email").send_keys(email)
    browser.find_element_by_css_selector("#pass").send_keys(password)

#1-3 パスワードの確認画面を閉じる

パスワードを入力すると、確認画面が送信ボタンの上に出てしまうので、関係ないほかのの部分をクリックすることによって消す。


#1-3 どこでもいいので、クリックしないと送信ボタンが押せないため、適当に押している
    browser.find_element_by_xpath('//*[@id="email_container"]/div/label').click()
    time.sleep(2)

#2 ログインメソッドを実行


#1で作成したメソッドを利用して、ログインする

facebookLogin(email, password)


全体のコード



facebookLogin.py


import os
from selenium import webdriver
import pandas
import time

browser = webdriver.Chrome(executable_path='/mnt/c/workspace/pydev/chromedriver.exe')

email = "FACEBOOKのメールアドレス"
password = "FACEBOOKのパスワード"

#1

def facebookLogin(email, password):

    #1-1 最初にPairsのFacebook認証を済ませる

    time.sleep(2)
    browser.get("ログインしたいFacebookアプリのURL")

    #1-2 値の入力

    browser.find_element_by_css_selector("#email").send_keys(email)
    browser.find_element_by_css_selector("#pass").send_keys(password)

    #1-3 どこでもいいので、クリックしないと送信ボタンが押せないため、適当に押している
    browser.find_element_by_xpath('//*[@id="email_container"]/div/label').click()
    time.sleep(2)

    browser.find_element_by_xpath('//*[@id="u_0_0"]').click()
    time.sleep(4)

#2 

if __name__ == '__main__':

    facebookLogin(email, password)




注目の投稿

 PythonのTweepyを利用して、Twitter APIを利用している。 その中で、ハマったポイントをメモしておく。 まず、Searchに関して。 Twitter検索は、クライアントアプリ側では、全期間の検索が可能になっている。 一方で、APIを利用する際は、過去1週間しか...