欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > python爬取企查查企業信息之selenium自動模擬登錄企查查

python爬取企查查企業信息之selenium自動模擬登錄企查查

熱門標簽:電話外呼系統招商代理 廣東旅游地圖標注 佛山通用400電話申請 打印谷歌地圖標注 蘇州人工外呼系統軟件 淮安呼叫中心外呼系統如何 電話機器人貸款詐騙 看懂地圖標注方法 京華圖書館地圖標注

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

python模擬登錄企查查最重要的是自動拖拽驗證插件

先介紹下項目中使用到的工具與庫

Python的selenium庫:

Web應用程序測試的工具,Selenium可以模擬用戶在瀏覽器中的操作,就像真實用戶使用一樣。

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

Chrome瀏覽器:

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

Chromedriver:

配合Selenium操作Chrome瀏覽器的驅動程序,注意在下載Chromedriver時必須與已安裝的Chrome瀏覽器版本號前3位保持一至

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

獲取完整項目代碼請關注下面的公眾號“python客棧”然后回復“qcc

第一步:下載配置Chromedriver

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

從官網下載的文件是一個壓縮包,解壓出Chromedriver.exe文件,

網上有很多文章說要正常使用Chromedriver.exe,需要配置系統的環境變量,其實這是一種比較麻煩的方法。

為了項目的可移動性和操作方便使用另一種方法,就是把Chrome瀏覽器安裝目錄下的整個Application目錄都復制到項目目錄下,這樣就可以隨便移動項目到新開發環境中而不用考慮新環境的系統環境變量了。

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

第二步:安裝selenium庫

pip安裝selenium庫

pip install selenium

Pycharm開發工具安裝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}")[a0kwwm0].{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}")[yao0kai].{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

要獲取完整項目代碼(selenium模擬登錄企查查+requests庫自動搜索獲取指定信息并保存Excel)請關注上面的公眾號“python客棧”然后回復“qcc

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

下一篇將介紹Python使用requests庫自動在企查查上搜索相關企業并獲取指定信息

您可能感興趣的文章:
  • python爬蟲利用selenium實現自動翻頁爬取某魚數據的思路詳解
  • Python selenium爬取微博數據代碼實例
  • Python進階之使用selenium爬取淘寶商品信息功能示例
  • python selenium爬取斗魚所有直播房間信息過程詳解
  • Python使用Selenium+BeautifulSoup爬取淘寶搜索頁
  • python爬蟲系列Selenium定向爬取虎撲籃球圖片詳解
  • Python爬蟲實戰之用selenium爬取某旅游網站

標簽:湖州 股票 呼和浩特 畢節 駐馬店 衡水 江蘇 中山

巨人網絡通訊聲明:本文標題《python爬取企查查企業信息之selenium自動模擬登錄企查查》,本文關鍵詞  python,爬取,企,查查,企業信息,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《python爬取企查查企業信息之selenium自動模擬登錄企查查》相關的同類信息!
  • 本頁收集關于python爬取企查查企業信息之selenium自動模擬登錄企查查的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    国产精品久久毛片a| 国产一区二区0| av一区二区三区| 国产精品天天干| 日韩一区二区影院| 图片区小说区国产精品视频| 国产精品一级无码| 欧美午夜精品久久久久久超碰| 综合久久给合久久狠狠狠97色 | 欧美日韩不卡一区二区| 亚洲免费av观看| 97aⅴ精品视频一二三区| 中文字幕在线有码| 最新国产の精品合集bt伙计| 不卡在线观看av| 色婷婷亚洲精品| 亚洲精品视频一区二区| 99v久久综合狠狠综合久久| 在线亚洲一区观看| 一区二区成人在线| 久久人妻少妇嫩草av蜜桃| 欧美乱熟臀69xxxxxx| 亚洲va天堂va国产va久| 最近中文字幕无免费| 日韩欧美视频在线| 精品一区二区三区在线播放| 五月天婷婷丁香网| 最新成人av在线| 久久久久99人妻一区二区三区| 欧美精选午夜久久久乱码6080| 亚洲成人av资源| ass精品国模裸体欣赏pics| 久久婷婷色综合| 成人在线视频首页| 欧美制服丝袜第一页| 午夜精品影院在线观看| 亚洲天堂资源在线| 久久久久久久久99精品| 成人污污视频在线观看| 欧美性大战xxxxx久久久| 日日摸夜夜添夜夜添精品视频| 青青草视频成人| 国产欧美va欧美不卡在线| 不卡视频一二三| 欧美精品久久天天躁| 捆绑变态av一区二区三区| 91香蕉视频网| 亚洲在线一区二区三区| 熟女俱乐部一区二区视频在线| 国产视频不卡一区| 95精品视频在线| 日韩精品一区二区三区三区免费 | 日本视频一区二区| 在线观看亚洲大片短视频| 亚洲人成网站精品片在线观看| 国产高潮失禁喷水爽到抽搐 | 欧美丰满少妇xxxxx高潮对白| 日韩av高清在线观看| 农村老熟妇乱子伦视频| 一区二区三国产精华液| 欧美特黄一区二区三区| 国产精品电影一区二区| 第四色在线视频| 中文字幕高清不卡| 深夜视频在线观看| 国产性色一区二区| 亚洲区 欧美区| 久久无码av三级| 男人添女人荫蒂国产| 久久中文字幕电影| 国产a级片视频| 国产免费成人在线视频| 最好看的中文字幕| 国产拍欧美日韩视频二区| 欧美熟妇精品一区二区| 欧美国产激情一区二区三区蜜月| 性生交大片免费看l| 国产午夜亚洲精品午夜鲁丝片| 免费观看一区二区三区| 久久亚洲捆绑美女| 黄色av电影网站| 国产精品国产馆在线真实露脸| 成人免费无码大片a毛片| 亚洲私人影院在线观看| v8888av| 亚洲激情自拍视频| 手机毛片在线观看| 日韩精品91亚洲二区在线观看 | 国产午夜精品理论片| 日韩国产欧美在线观看| 在线观看日韩毛片| 国产精品1024| 日韩欧美一区二区免费| 美女被艹视频网站| 国产女人aaa级久久久级 | 亚洲与欧洲av电影| 二区三区四区视频| 毛片基地黄久久久久久天堂| 欧美日韩亚洲另类| 成人黄页毛片网站| 欧美激情一区在线观看| 中文字幕一区二区三区人妻不卡| 亚洲精品视频免费观看| 欧美黄色aaa| 国产精品影视在线观看| 欧美一区二区性放荡片| 中文字幕人妻熟女人妻a片| 中文字幕一区二区三区不卡| 黄色免费一级视频| 精品在线播放免费| 精品区一区二区| 成人性生活免费看| 亚洲第一福利视频在线| 色狠狠综合天天综合综合| 国产不卡视频在线播放| 国产性色一区二区| www亚洲色图| 久久99国产精品久久99| 欧美成人bangbros| 国产精品一级黄片| 日韩精品色哟哟| 欧美一区二区女人| 国产麻豆剧传媒精品国产av| 亚洲午夜在线观看视频在线| 欧美亚洲国产一区二区三区va| av在线不卡免费看| 1000精品久久久久久久久| 成人免费视频网站入口::| 国产aⅴ精品一区二区三区色成熟| 国产色产综合色产在线视频| 亚洲天堂岛国片| 麻豆视频一区二区| 26uuu亚洲| 丁香六月激情综合| 国产久卡久卡久卡久卡视频精品| 国产亚洲精品aa| h色网站在线观看| www.66久久| 亚洲激情第一区| 欧美日韩黄色一区二区| 午夜不卡久久精品无码免费| 午夜精品成人在线| 日韩视频免费直播| 日韩一级av毛片| 国产精品69久久久久水密桃| 国产精品久久免费看| 在线日韩国产精品| www.黄色网| 日韩在线观看一区二区| 欧美成人性福生活免费看| 国产成人福利在线| 国产精品一区二区黑丝| 国产精品福利在线播放| 欧美亚洲动漫制服丝袜| 国产+高潮+白浆+无码| 蜜臀av一区二区在线免费观看| 亚洲精品一区二区三区精华液| 婷婷丁香综合网| 成人av网在线| 亚洲成人av资源| 久久蜜桃一区二区| 色一区在线观看| 久久久久久久人妻无码中文字幕爆| 琪琪久久久久日韩精品| 国产无遮挡一区二区三区毛片日本| 91精品少妇一区二区三区蜜桃臀| 99久久国产综合精品麻豆| 亚洲成人1区2区| 精品国产乱码久久久久久夜甘婷婷| 熟女av一区二区| 久久久久久无码精品人妻一区二区| 日本aⅴ亚洲精品中文乱码| 久久精品亚洲精品国产欧美| 69av.com| 亚洲激情 欧美| 国产河南妇女毛片精品久久久| 亚洲精品精品亚洲| 精品三级在线看| 69av视频在线| 熟女少妇一区二区三区| 成人免费va视频| 日韩精品高清不卡| 国产精品电影一区二区| 欧美一区二区国产| 日韩精品一区二区亚洲av性色| 国产情侣久久久久aⅴ免费| 国产一区二区三区精品视频| 一区二区三区资源| 久久久蜜桃精品| 欧美日韩一区二区三区在线| www亚洲色图| www男人天堂| 国产一区二区剧情av在线| 亚洲最新在线观看| 国产亚洲午夜高清国产拍精品| 欧美三级中文字幕在线观看| 欧美亚洲色综久久精品国产| 国产xxxx视频| fc2成人免费人成在线观看播放| 日本不卡一二三区黄网|