※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
また折を見て追記していきたいと思います。
ご指摘や意見などお待ちしています。