2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Seleniumでサイトへアクセス

Last updated at Posted at 2019-05-08

※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

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

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?