最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python爬取企查查企業(yè)信息之selenium自動(dòng)模擬登錄企查查

 更新時(shí)間:2021年04月08日 15:13:56   投稿:WDC  
這篇文章主要介紹了python爬取企查查企業(yè)信息之自動(dòng)模擬登錄企查查以及selenium獲取headers,selenium獲取cookie,需要的朋友可以參考下

最近接了個(gè)小項(xiàng)目需要批量搜索企查查上的相關(guān)企業(yè)并把指定信息保存到Excel文件中,由于企查查需要登錄后才能查看所有搜索到的信息所以第一步需要模擬登錄企查查。

python模擬登錄企查查最重要的是自動(dòng)拖拽驗(yàn)證插件

先介紹下項(xiàng)目中使用到的工具與庫

Python的selenium庫:

Web應(yīng)用程序測(cè)試的工具,Selenium可以模擬用戶在瀏覽器中的操作,就像真實(shí)用戶使用一樣。

官方技術(shù)文檔:https://www.selenium.dev/selenium/docs/api/py/index.html

Chrome瀏覽器:

谷歌瀏覽器,不作過多介紹

Chromedriver:

配合Selenium操作Chrome瀏覽器的驅(qū)動(dòng)程序,注意在下載Chromedriver時(shí)必須與已安裝的Chrome瀏覽器版本號(hào)前3位保持一至

官方下載地址:http://chromedriver.storage.googleapis.com/index.html

獲取完整項(xiàng)目代碼請(qǐng)關(guān)注下面的公眾號(hào)“python客棧”然后回復(fù)“qcc

第一步:下載配置Chromedriver

假設(shè)電腦中已安裝Chrome最新版(如果沒有安裝請(qǐng)自行下載安裝),下載與電腦系統(tǒng)、Chrome版本相匹配的版本(Chromedriver的版本號(hào)必須與安裝的Chrome版本號(hào)一至)。

從官網(wǎng)下載的文件是一個(gè)壓縮包,解壓出Chromedriver.exe文件,

網(wǎng)上有很多文章說要正常使用Chromedriver.exe,需要配置系統(tǒng)的環(huán)境變量,其實(shí)這是一種比較麻煩的方法。

為了項(xiàng)目的可移動(dòng)性和操作方便使用另一種方法,就是把Chrome瀏覽器安裝目錄下的整個(gè)Application目錄都復(fù)制到項(xiàng)目目錄下,這樣就可以隨便移動(dòng)項(xiàng)目到新開發(fā)環(huán)境中而不用考慮新環(huán)境的系統(tǒng)環(huán)境變量了。

把解壓出Chromedriver.exe文件復(fù)制到項(xiàng)目目錄下的從Chrome瀏覽器安裝目錄中復(fù)制過來的Application目錄下,保證Chromedriver.exe文件與chrome.exe文件在同一目錄下。

第二步:安裝selenium庫

pip安裝selenium庫

pip install selenium

Pycharm開發(fā)工具安裝selenium庫

在Pycharm菜單欄中找到并點(diǎn)擊【file】->【settings】

在彈出窗口中按下圖所示操作

第三步:自動(dòng)模擬登錄企查查python代碼編寫

首先引入selenium相關(guān)庫

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基本配置參數(shù)

    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')  # 禁用瀏覽器正在被自動(dòng)化程序控制的提示
    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必須參數(shù)
    driver = webdriver.Chrome(options=options, executable_path="Application/chromedriver.exe", desired_capabilities=d)
    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {#清除驗(yàn)證插件中windows.navigator.webdriver的值
        "source": """
        Object.defineProperty(navigator, 'webdriver', {
          get: () => undefined
        })
      """
    })

模擬用戶在頁面中的一系列操作

    driver.implicitly_wait(2)#延時(shí)
    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"]'))
    # 找到賬號(hào)輸入框
    driver.find_element_by_xpath('//input[@id="nameVerify"]').send_keys('手機(jī)號(hào)')

自動(dòng)拖動(dòng)驗(yàn)證插件滑塊并驗(yàn)證

驗(yàn)證插件會(huì)檢測(cè)瀏覽器是否為webdriver即使用JS檢查windows.navigator.webdriver值

所以需要在頁面加載前手動(dòng)修改windows.navigator.webdriver值

driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": """
        Object.defineProperty(navigator, 'webdriver', {
          get: () => undefined
        })
      """
    })

修改完成windows.navigator.webdriver值后再模擬拖動(dòng)驗(yàn)證插件滑塊

    # 滑動(dòng)條定位
    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()

檢查驗(yàn)證是否成功

    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', '請(qǐng)手工驗(yàn)證')
    except:
        tr = driver.find_element_by_xpath('//span[@class="nc-lang-cnt"][1]')
        if tr.text != '驗(yàn)證通過':
            set_id_att(driver, 'tt', 'innerHTML', '請(qǐng)手工驗(yàn)證')
            # for i in range(1, 6):
            #    if tr.text == '驗(yàn)證通過':
            #        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', '請(qǐng)?zhí)钊胧謾C(jī)驗(yàn)證碼')
    # 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)

上面的代碼中在頁面里增加了一些狀態(tài)顯示元素及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訪問頁面元素寫成函數(shù)方便以后操作

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

def set_class_att(bor, classs, id, att, val):
    bor.execute_script('document.getElementsByClassName("{a}")[wppm3vysvbp].="{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}").="{c}"'.format(a=id, b=att, c=val))

def set_class_att(bor, classs, id, att, val):
    bor.execute_script('document.getElementsByClassName("{a}")[wppm3vysvbp].="{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')  # 禁用瀏覽器正在被自動(dòng)化程序控制的提示
    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"]'))
    # 找到賬號(hào)輸入框
    driver.find_element_by_xpath('//input[@id="nameVerify"]').send_keys('19942496979')
    # 滑動(dòng)條定位
    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', '請(qǐng)手工驗(yàn)證')
    except:
        tr = driver.find_element_by_xpath('//span[@class="nc-lang-cnt"][1]')
        if tr.text != '驗(yàn)證通過':
            set_id_att(driver, 'tt', 'innerHTML', '請(qǐng)手工驗(yàn)證')
            # for i in range(1, 6):
            #    if tr.text == '驗(yàn)證通過':
            #        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', '請(qǐng)?zhí)钊胧謾C(jī)驗(yàn)證碼')
    # 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()#自動(dòng)登錄并獲取登錄后的Headers包括cookies

要獲取完整項(xiàng)目代碼(selenium模擬登錄企查查+requests庫自動(dòng)搜索獲取指定信息并保存Excel)請(qǐng)關(guān)注上面的公眾號(hào)“python客棧”然后回復(fù)“qcc

本文主要介紹了如何使用python的selenium模擬登錄企查查,主要介紹了如何使用selenium保存Cookies與headers、自動(dòng)驗(yàn)證及selenium庫對(duì)頁面元素的一些操作方法

下一篇將介紹Python使用requests庫自動(dòng)在企查查上搜索相關(guān)企業(yè)并獲取指定信息

相關(guān)文章

  • python requests模塊的使用示例

    python requests模塊的使用示例

    這篇文章主要介紹了python requests模塊的使用解析,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-04-04
  • win10系統(tǒng)下Anaconda3安裝配置方法圖文教程

    win10系統(tǒng)下Anaconda3安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了win10系統(tǒng)下Anaconda3安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • 什么是Python中的匿名函數(shù)

    什么是Python中的匿名函數(shù)

    在本篇文章里小編給大家整理的是關(guān)于Python匿名函數(shù)知識(shí)點(diǎn)總結(jié),需要的朋友們可以學(xué)習(xí)參考下。
    2020-06-06
  • 如何完美的建立一個(gè)python項(xiàng)目

    如何完美的建立一個(gè)python項(xiàng)目

    在本篇文章里小編給大家整理了關(guān)于如何完美的建立一個(gè)python項(xiàng)目的相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2020-10-10
  • 使用Python 操作 xmind 繪制思維導(dǎo)圖的詳細(xì)方法

    使用Python 操作 xmind 繪制思維導(dǎo)圖的詳細(xì)方法

    在平時(shí)的工作中當(dāng)我們要總結(jié)一些知識(shí)的時(shí)候就需要一款工具來畫畫流程圖,這里推薦 XMind 軟件,用 Xmind 繪制的思維導(dǎo)圖看起來思路清晰,那么今天的文章介紹關(guān)于思維導(dǎo)圖的相關(guān)知識(shí)以及用 Python 如何操作 Xmind 繪制思維導(dǎo)圖
    2021-10-10
  • Python字符串的轉(zhuǎn)義字符

    Python字符串的轉(zhuǎn)義字符

    這篇文章主要介紹了Python字符串的轉(zhuǎn)義字符,轉(zhuǎn)義字符是指,用一些普通字符的組合來代替一些特殊字符,由于其組合改變了原來字符表示的含義,下文相關(guān)資料需要的小伙伴可以參考一下
    2022-04-04
  • Django的models模型的具體使用

    Django的models模型的具體使用

    這篇文章主要介紹了Django的models模型的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Python庫?Bokeh?數(shù)據(jù)可視化實(shí)用指南

    Python庫?Bokeh?數(shù)據(jù)可視化實(shí)用指南

    大家好,今天跟大家分享的是交互式可視化神器?Python?Bokeh?的詳細(xì)使用教程,Bokeh是一個(gè)面向現(xiàn)代web瀏覽器的交互式可視化庫。它提供了多功能圖形的優(yōu)雅、簡(jiǎn)潔的構(gòu)造,并在大型數(shù)據(jù)集或流式數(shù)據(jù)集上提供了高性能的交互性,接下來讓我們?cè)敿?xì)看看吧
    2021-11-11
  • Python繪制數(shù)據(jù)動(dòng)態(tài)圖的方法詳解

    Python繪制數(shù)據(jù)動(dòng)態(tài)圖的方法詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用Python語言繪制好看的數(shù)據(jù)動(dòng)態(tài)圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起動(dòng)手嘗試一下
    2022-07-07
  • Python技巧匿名函數(shù)、回調(diào)函數(shù)和高階函數(shù)

    Python技巧匿名函數(shù)、回調(diào)函數(shù)和高階函數(shù)

    本文分享的是Python技巧匿名函數(shù)、回調(diào)函數(shù)和高階函數(shù),我們?cè)赑ython中使用lambda表達(dá)式來使用匿名函數(shù),回調(diào)函數(shù)即callback,先寫一個(gè)函數(shù),讓預(yù)先寫好的系統(tǒng)來調(diào)用,一個(gè)函數(shù)可以作為參數(shù)傳給另外一個(gè)函數(shù),或者一個(gè)函數(shù)的返回值為另外一個(gè)函數(shù),滿足其一則為高階函數(shù)
    2021-12-12

最新評(píng)論

平遥县| 茂名市| 莱芜市| 清新县| 昆山市| 额敏县| 波密县| 五大连池市| 三穗县| 中宁县| 交城县| 陆河县| 米泉市| 安康市| 扬州市| 红河县| 新和县| 平顺县| 克什克腾旗| 朝阳市| 荥阳市| 封丘县| 新田县| 贡觉县| 德江县| 巴东县| 怀化市| 当涂县| 定远县| 会昌县| 平顺县| 吴旗县| 阳朔县| 临武县| 理塘县| 汉川市| 石首市| 长岛县| 通道| 芷江| 桃园县|