pythonは企業に登り、企業情報のselenium自動シミュレーション登録企業の調査を行う。

17220 ワード

最近は小項目を受けましたが、大量に企業を検索して調べて、指定情報をExcelファイルに保存しています。企業の調査には登録後に検索した情報が全部確認できますので、第一歩は模擬登録企業の調査が必要です。
pythonアナログ登録企業のチェックで最も重要なのは、自動ドラッグ検証プラグインです。

まずプロジェクトで使用したツールとライブラリを紹介します。
Pythonのselenium庫:
Webアプリケーションテストのツールは、Seleniumは、実際のユーザが使用するように、ブラウザ内のユーザの操作をシミュレートすることができます。
公式技術文書:https://www.selenium.dev/selenium/docs/api/py/index.html
Chromeブラウザ:
Googleのブラウザー、多すぎる紹介を行いません。
Chromedriver:
Seleniumと連携してChromeブラウザを操作するドライバは、Chromedriverをダウンロードする時に既にインストールされているChromeブラウザのバージョン番号の前の3桁と同じままにしてください。
公式ダウンロードアドレス:http://chromedriver.storage.googleapis.com/index.html
完全なプロジェクトコードを取得するには、下記の公衆番号「pythonゲストスタック」に注目して、「qcc」に返信してください。

第一歩:ダウンロードプロファイルChromedriver
PCにChrome最新版がインストールされていると仮定します。(インストールされていない場合は、自分でダウンロードしてインストールしてください)、コンピュータシステム、Chromeバージョンにマッチするバージョンをダウンロードします。

公式サイトからダウンロードしたファイルは圧縮パッケージで、Chromedriver.exeファイルを解凍します。
ネット上では、Chromedriver.exeを正常に使うには、システムの環境変数を配置する必要があるという記事がたくさんありますが、これは厄介な方法です。
プロジェクトの可搬性と操作を容易にするために別の方法があります。つまり、Chromeブラウザのインストールディレクトリの全体のAppplicationディレクトリをプロジェクトディレクトリの下にコピーすることで、新しい環境を考慮せずにプロジェクトを新開発環境の中に自由に移動することができます。

解凍されたChromedriver.exeファイルをプロジェクトディレクトリの下にコピーしたChromeブラウザのインストールディレクトリからコピーしたAppplicationディレクトリの下で、Chromedriver.exeファイルとchrome.exeファイルが同じディレクトリの下にあることを保証します。

ステップ2:seleniumライブラリの設置
pipにseleniumライブラリを取り付けるpip install seleniumPycharm開発ツールはseleniumライブラリをインストールします。
Pycharmメニューバーで【file】-【settings】を見つけてクリックします。

ポップアップ画面で下図のように操作します。

第三ステップ:自動アナログ登録企業の調査pythonコードの作成
まずはselenium関連ライブラリを導入します。

import time
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
webdriver基本設定パラメータを初期化します。

    options = webdriver.ChromeOptions()
    # options.add_argument('--headless')  #        
    options.add_argument('--disable-gpu')  #   gpu,         
    options.add_argument('blink-settings=imagesEnabled=false')  #      ,     
    options.add_argument('--disable-infobars')  #                   
    options.add_argument('--start-maximized')
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    d = DesiredCapabilities.CHROME
    d['goog:loggingPrefs'] = {'performance': 'ALL'}#   Headers    
    driver = webdriver.Chrome(options=options, executable_path="Application/chromedriver.exe", desired_capabilities=d)
    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {#       windows.navigator.webdriver  
        "source": """
        Object.defineProperty(navigator, 'webdriver', {
          get: () => undefined
        })
      """
    })
ユーザーのページでの一連の操作をシミュレートします。

    driver.implicitly_wait(2)#  
    driver.set_window_size(width=800, height=600)
    driver.get("https://www.QCC.com/")
    driver.find_element_by_xpath('//a[@class="navi-btn"][1]').click()
    locator = (By.ID, "dom_id_two")
    try:
        WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))
    except:
        driver.close()
    # WebDriverWait(driver,20,0.5).until(lambda driver:driver.find_element_by_xpath('//span[@class="nc_iconfont btn_slide"]'))
    #        
    driver.find_element_by_xpath('//input[@id="nameVerify"]').send_keys('   ')
自動ドラッグして検証プラグインのスライダを検証します。
プラグインを確認します。ブラウザがwebdriverかどうかはJSでWindows.navigator.webdriverの値を確認します。
ですから、ページを読み込む前に手動でWindows.navigator.webdriverの値を修正する必要があります。

driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": """
        Object.defineProperty(navigator, 'webdriver', {
          get: () => undefined
        })
      """
    })
windows.navigator.webdriver値を修正してからアナログドラッグしてプラグインのスライダーを検証します。

    #      
    start = driver.find_element_by_xpath('//span[@class="nc_iconfont btn_slide"]')
    action = ActionChains(driver)
    action.click_and_hold(start)
    action.drag_and_drop_by_offset(start, 308, 0).perform()
検証が成功したかどうかを確認する。

    time.sleep(2)
    style = 'position:absolute;top:0;left:0;width:100%;z-index:999;font-size:40px;line-height:100px;background:rgba(255,217,0,90%);height:100%;text-align:center;color:#000;'
    driver.execute_script(
        'var htm=document.getElementsByClassName("login-sao-panel")[0];htm.innerHTML+="<div style={style}><b id=tt></b><b id=ts></b></div>"'.format(
            style=style))

    ts = driver.find_element_by_id('ts')
    tt = driver.find_element_by_id('tt')

    try:
        driver.find_element_by_xpath('//div[@class="errloading"][1]')
        set_id_att(driver, 'tt', 'innerHTML', '     ')
    except:
        tr = driver.find_element_by_xpath('//span[@class="nc-lang-cnt"][1]')
        if tr.text != '    ':
            set_id_att(driver, 'tt', 'innerHTML', '     ')
            # for i in range(1, 6):
            #    if tr.text == '    ':
            #        break
            #    set_id_att(driver, 'ts', 'innerHTML', i)
            #    time.sleep(1)
    try:
        driver.find_element_by_xpath('//a[@class="text-primary vcode-btn get-mobile-code"]').click()
    except:
        pass
    # code=driver.find_element_by_xpath('//input[@id="vcodeNormal"]')
    set_id_att(driver, 'tt', 'innerHTML', '        ')
    # rjs='const callback = arguments[arguments.length - 1];callback({v:document.getElementById("vcodeNormal").value})'
    rjs = 'return document.getElementById("vcodeNormal").value'
    locator = (By.CLASS_NAME, "nav-user")
    but = driver.find_element_by_xpath('//form[@id="user_login_verify"]/button')
    for i in range(1, 1):
        # code = driver.execute_async_script(rjs)
        code = driver.execute_script(rjs)
        if len(code) == 6:
            but.click()
            try:
                #WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located(locator))
                break
            except:
                pass
                #return 0
        set_id_att(driver, 'ts', 'innerHTML', i)
        time.sleep(1)
上のコードには、ページ内にステータス表示要素とJSコードが追加されています。

    style = 'position:absolute;top:0;left:0;width:100%;z-index:999;font-size:40px;line-height:100px;background:rgba(255,217,0,90%);height:100%;text-align:center;color:#000;'
    driver.execute_script(
        'var htm=document.getElementsByClassName("login-sao-panel")[0];htm.innerHTML+="<div style={style}><b id=tt></b><b id=ts></b></div>"'.format(
            style=style))
seleniumアクセスページの要素を関数に書いて便利にしてから操作します。

def set_id_att(bor, id, att, val):
    bor.execute_script('document.getElementById("{a}").{b}="{c}"'.format(a=id, b=att, c=val))

def set_class_att(bor, classs, id, att, val):
    bor.execute_script('document.getElementsByClassName("{a}")[{d}].{b}="{c}"'.format(a=classs, b=att, c=val, d=id))
登録が成功したら、ページのheaders、Cookieを取得して、後のrequestsライブラリを利用してもいいです。
selenium取得ページheadersヘッダ情報

def getheader(browser):
    for responseReceived in browser.get_log('performance'):
        try:
            response = json.loads(responseReceived[u'message'])[u'message'][u'params'][u'response']
            if response[u'url'] == browser.current_url:
                return response[u'requestHeaders']
        except:
            pass
    return None
selenium取得ページ登録後Cookie

cookie = [item["name"] + "=" + item["value"] for item in driver.get_cookies()]
headers['cookie'] = ';'.join(item for item in cookie)
完全コードは以下の通りです

import time
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

def getheader(browser):
    for responseReceived in browser.get_log('performance'):
        try:
            response = json.loads(responseReceived[u'message'])[u'message'][u'params'][u'response']
            if response[u'url'] == browser.current_url:
                return response[u'requestHeaders']
        except:
            pass
    return None

def set_id_att(bor, id, att, val):
    bor.execute_script('document.getElementById("{a}").{b}="{c}"'.format(a=id, b=att, c=val))

def set_class_att(bor, classs, id, att, val):
    bor.execute_script('document.getElementsByClassName("{a}")[{d}].{b}="{c}"'.format(a=classs, b=att, c=val, d=id))

def login():
    options = webdriver.ChromeOptions()
    # options.add_argument('--headless')  #        
    options.add_argument('--disable-gpu')  #   gpu,         
    options.add_argument('blink-settings=imagesEnabled=false')  #      ,     
    options.add_argument('--disable-infobars')  #                   
    options.add_argument('--start-maximized')
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    d = DesiredCapabilities.CHROME
    d['goog:loggingPrefs'] = {'performance': 'ALL'}
    driver = webdriver.Chrome(options=options, executable_path="Application/chromedriver.exe", desired_capabilities=d)
    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": """
        Object.defineProperty(navigator, 'webdriver', {
          get: () => undefined
        })
      """
    })
    driver.implicitly_wait(2)
    driver.set_window_size(width=800, height=600)
    driver.get("https://www.QCC.com/",)
    driver.find_element_by_xpath('//a[@class="navi-btn"][1]').click()
    locator = (By.ID, "dom_id_two")
    try:
        WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))
    except:
        driver.close()
    # WebDriverWait(driver,20,0.5).until(lambda driver:driver.find_element_by_xpath('//span[@class="nc_iconfont btn_slide"]'))
    #        
    driver.find_element_by_xpath('//input[@id="nameVerify"]').send_keys('19942496979')
    #      
    start = driver.find_element_by_xpath('//span[@class="nc_iconfont btn_slide"]')
    action = ActionChains(driver)
    action.click_and_hold(start)
    action.drag_and_drop_by_offset(start, 308, 0).perform()
    time.sleep(2)
    style = 'position:absolute;top:0;left:0;width:100%;z-index:999;font-size:40px;line-height:100px;background:rgba(255,217,0,90%);height:100%;text-align:center;color:#000;'
    driver.execute_script(
        'var htm=document.getElementsByClassName("login-sao-panel")[0];htm.innerHTML+="<div style={style}><b id=tt></b><b id=ts></b></div>"'.format(
            style=style))

    ts = driver.find_element_by_id('ts')
    tt = driver.find_element_by_id('tt')

    try:
        driver.find_element_by_xpath('//div[@class="errloading"][1]')
        set_id_att(driver, 'tt', 'innerHTML', '     ')
    except:
        tr = driver.find_element_by_xpath('//span[@class="nc-lang-cnt"][1]')
        if tr.text != '    ':
            set_id_att(driver, 'tt', 'innerHTML', '     ')
            # for i in range(1, 6):
            #    if tr.text == '    ':
            #        break
            #    set_id_att(driver, 'ts', 'innerHTML', i)
            #    time.sleep(1)
    try:
        driver.find_element_by_xpath('//a[@class="text-primary vcode-btn get-mobile-code"]').click()
    except:
        pass
    # code=driver.find_element_by_xpath('//input[@id="vcodeNormal"]')
    set_id_att(driver, 'tt', 'innerHTML', '        ')
    # rjs='const callback = arguments[arguments.length - 1];callback({v:document.getElementById("vcodeNormal").value})'
    rjs = 'return document.getElementById("vcodeNormal").value'
    locator = (By.CLASS_NAME, "nav-user")
    but = driver.find_element_by_xpath('//form[@id="user_login_verify"]/button')
    for i in range(1, 1):
        # code = driver.execute_async_script(rjs)
        code = driver.execute_script(rjs)
        if len(code) == 6:
            but.click()
            try:
                #WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located(locator))
                break
            except:
                pass
                #return 0
        set_id_att(driver, 'ts', 'innerHTML', i)
        time.sleep(1)

    headers = getheader(driver)#  headers
    ip = "202.121.178.244"
    if headers:
        #  cookie   headers 
        cookie = [item["name"] + "=" + item["value"] for item in driver.get_cookies()]
        headers['cookie'] = ';'.join(item for item in cookie)
        del headers[':authority']
        del headers[':method']
        del headers[':path']
        del headers[':scheme']
        headers['X-Forwarded-For'] = ip
        headers['X-Remote-IP'] = ip
        headers['X-Originating-IP'] = ip
        headers['X-Remote-Addr'] = ip
        headers['X-Client-IP'] = ip
    return headers

headers=login()#           Headers  cookies
完全プロジェクトコードを取得するには、上記の公衆番号「pythonゲストスタック」に注目して、「qcc」に返信してください。
本文は主にpythonのseleniumを使って、どうやって登録企業をシミュレーションして調べるかを紹介しています。主にseleniumを使ってCookiesとheadersを保存するか、自動検証とseleniumライブラリのページ要素に対する操作方法を紹介しています。
次のページでは、Pythonがrequestsライブラリを使って自動的に企業調査で関連企業を検索し、指定情報を取得することを紹介します。