Seleniumでサイトへアクセス

※2020/01/07追記もとい書き直し
ﾁｬｯｽ('ω')

Seleniumは今の現場先で初めて触れて、独学ながら書いてます。
その中で私がメソッド化したものをいくつか紹介しつつ、
色々な意見をもらえたらなと思い書きました！



## Selenium概要
Webブラウザを自動でいじって、データも持ってこれる
便利なライブラリ。IeよりChromeとかの方がより自由に
操作できるけど、環境変数にWebdriverを指定してあげたり
インターネット設定を整えてあげたりしないとそもそも
使用できなかったりする繊細さを持ち合わせてるゾ！


## 1)Web要素取得メソッド

Webページ上の文字や入力欄などのオブジェクトを取得するのに使う
メソッドです。取得したいターゲットによってGet_Element_byなんちゃら～
といちいち書かないといけないのが煩わしくて、
methodの変数で略称などで指定できるようにしてます。
またページの読み込み待ちでページが表示しきれていない場合のために、
要素を取得できるまで何回か繰り返して要素の取得を試みます。


```
import time

def tryal(
    target='',  #  取得したい要素名、パス名
    method='xpath',  #  web要素を取得する方法（デフォルトはXpath）
    driver='',  #  抽象オブジェクトのdriverを指定
    num=3  #  要素を取得するのを繰り返す回数
):
    method = method.lower()
    reitem = None
    errornum = 0
    while True:
        try:
            if method == "id":
                reitem = find_element_by_id(target)
            elif method == "name":
                reitem = find_element_by_name(target)
            elif method == "xpath":
                reitem = find_element_by_xpath(target)
            elif method == "link" or method == "link_text":
                reitem = find_element_by_link_text(target)
            elif method == "partial_link_text" or method == "partial":
                reitem = find_element_by_partial_link_text(target)
            elif method == "tag" or method == "tag_name":
                reitem = find_element_by_tag_name(target)
            elif method == "class" or method == "class_name":
                reitem = find_element_by_class_name(target)
            elif method == "css" or method == "css_selector":
                reitem = find_element_by_css_selector(target)
            else:
                print("This method is invalid.")
                raise Exception
            break
        except:
            time.sleep(2)
            errornum += 1
            print("retry:" + target)
            if errornum > num:
                print("failed to get:" + target)
                raise Exception
    return reitem
```

## 2) webページの開始

※webdriverの位置は「C:\python\webdriver」に指定しています。

```
import os
import selenium
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver import Proxy
from selenium.webdriver import FirefoxProfile

webdriver_path= r'C:\python\webdriver'  #  webdriverの位置

def log(browser='ff',webdriver_path=webdriver_path):
    #ブラウザを選択してログインを実行
    PATH = os.environ['PATH']
    if PATH.find(webdriver_path)==-1:
        PATH = '{0};{1}'.format(webdriver_path,PATH)
        os.environ['PATH'] = PATH
    options = Options()
    options.headless = True
    browser = browser.lower()
    if browser == "chrome" or browser == "google" or browser == "googlechrome" or browser == "chro":
        options.add_argument('--ignore-certificate-errors')
        driver = webdriver.Chrome()
    elif browser == "ff" or browser == "firefox" or browser == "fox":
        driver = logff()
    elif browser == "microsoftedge" or browser == "edge" or browser == "microsoft":
        driver = webdriver.Edge('{0}\\{1}'.format(webdriver_path,'msedgedriver.exe'))
    elif browser == "ie" or browser == "internetexplorer" or browser == "explorer":
        driver = webdriver.Ie("IEDriverServer.exe")
    else:
        print("This browser is invalid")
    
    return driver

def logff():
    PATH = os.environ['PATH']
    if PATH.find(webdriver_path)==-1:
        PATH = '{0};{1}'.format(webdriver_path,PATH)
        os.environ['PATH'] = PATH
    
    #プロファイル設定
    download_dir = 'C:\python' #ダウンロード先のパス
    fp = webdriver.FirefoxProfile()
    fp.set_preference("browser.download.folderList",2) # 0:デスクトップ、1:システム規定のフォルファ、2:ユーザ定義フォルダ
    fp.set_preference("browser.download.dir",download_dir) # 上記で2を選択したのでファイルのダウンロード場所を指定
    fp.set_preference("browser.download.manager.showWhenStarting",False)  # ダウンロード完了時にダウンロードマネージャウィンドウを表示するかどうかを示す真偽値。
    fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/octet-stream")  # mimeタイプを設定
   
    driver = webdriver.Firefox(firefox_profile=fp)
    return driver

```

また以下は関係ないですが、pandasでのDataframe読みこみようの
メソッドです。
拡張子の文字列とライブラリ（chardet）でのエンコード指定を利用して、
大体のファイルの読み込みが可能です。


```
import pandas as pd
iport chardet

def read_data(
    filepath=''
):
    with open(filepath,mode='rb') as f:
        encodeing =  f.read()
    encode = chardet.detect(encoding)
    if filepath[-3:] == 'csv':
        df = pd.read_csv(filepath,encoding=encode)
    elif filepath[-3:] == 'xlsx' or filepath[-3:] == 'xls':
        df = pd.read_excel(filepath,encoding=encode)
    return df
```


また折を見て追記していきたいと思います。
ご指摘や意見などお待ちしています。