<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          最新驗(yàn)證碼識別模擬登陸B(tài)站

          共 4357字,需瀏覽 9分鐘

           ·

          2021-02-02 08:51

          「本文目錄」

          • 1 分析登錄界面結(jié)構(gòu)
          • 2 使用selenium打開登錄頁面
          • 3 獲取頁面當(dāng)前驗(yàn)證碼圖片
          • 4 使用超級鷹識別驗(yàn)證碼
          • 5 對獲取的坐標(biāo)數(shù)據(jù)進(jìn)行提取,并用動作鏈完成點(diǎn)擊

          1 分析登錄界面結(jié)構(gòu)

          首先明確我們的目標(biāo),打開登陸界面,定位用戶名和密碼對應(yīng)的標(biāo)簽,輸入相關(guān)數(shù)據(jù)后,點(diǎn)擊登錄,此時(shí)頁面會彈出驗(yàn)證碼。

          下面用兩種方法進(jìn)行驗(yàn)證碼的獲取,然后提交給「超級鷹」進(jìn)行識別,接收到漢字的坐標(biāo)后,處理數(shù)據(jù),然后用動作鏈進(jìn)行點(diǎn)擊操作,最后定位點(diǎn)擊確認(rèn),登陸成功。

          2 使用selenium打開登錄頁面

          「代碼實(shí)現(xiàn):」

          #?使用selenium打開登錄界面
          bro?=?webdriver.Chrome(executable_path='./chromedriver')
          bro.get('https://passport.bilibili.com/login')

          #?定位用戶名,密碼輸入框
          username?=?bro.find_element_by_id('login-username')
          password?=?bro.find_element_by_id('login-passwd')

          sleep(1)
          #?將自己的用戶名密碼替換xxxxxx
          username.send_keys('xxxxxx')
          sleep(1)
          password.send_keys('xxxxxx')
          sleep(1)

          #?定位登錄按鈕并點(diǎn)擊
          bro.find_element_by_xpath('//*[@id="geetest-wrap"]/div/div[5]/a[1]').click()
          sleep(2)

          3 獲取頁面當(dāng)前驗(yàn)證碼圖片

          3.1 方法一:頁面截圖,將驗(yàn)證碼區(qū)域進(jìn)行裁剪保存

          使用此方法時(shí),注意我們截取驗(yàn)證碼圖片時(shí)需要截取完整,完整驗(yàn)證碼截圖如下:

          首先做的當(dāng)然是將點(diǎn)擊登錄后的頁面進(jìn)行截圖,然后定位到驗(yàn)證碼的位置,通過location()方法獲取驗(yàn)證碼左上角的坐標(biāo), size() 獲取驗(yàn)證碼的寬和高,左上角坐標(biāo)加上寬和高就是驗(yàn)證碼右下角的坐標(biāo)。獲取坐標(biāo)后就可以用crop()方法來進(jìn)行裁剪,然后將裁剪到的驗(yàn)證碼圖片保存。

          此時(shí)雖然獲取了驗(yàn)證碼圖片,但是還不能直接提交給超級鷹。
          因?yàn)槌夲椬R別的驗(yàn)證碼圖片的寬和高有限制,最好不超過460px*310px
          但是截取到的驗(yàn)證碼圖片寬高為338px*432px,這時(shí)就要先將圖片縮小一倍再提交即可,等到收到坐標(biāo)數(shù)據(jù)再將坐標(biāo)乘2

          「代碼實(shí)現(xiàn):」
          #?本文相關(guān)完整代碼可以關(guān)注微信公眾號:簡說Python,回復(fù):B站?獲取。
          #?save_screenshot就是將當(dāng)前頁面進(jìn)行截圖且保存
          bro.save_screenshot('page.png')

          #?定位驗(yàn)證碼圖片的位置
          code_img_ele?=?bro.find_element_by_xpath('/html/body/div[2]/div[2]/div[6]/div/div')
          location?=?code_img_ele.location??#?驗(yàn)證碼左上角的坐標(biāo)x,y
          size?=?code_img_ele.size??#?驗(yàn)證碼圖片對應(yīng)的長和寬

          #?左上角和右下角的坐標(biāo)
          #?這里坐標(biāo)乘1.25是由于電腦屏幕的比例不是100%,我的是125%,請自行在設(shè)置中查看
          rangle?=?(
          ????int(location['x']?*?1.25),?int(location['y']?*?1.25),?int((location['x']?+?size['width'])?*?1.25),
          ????int((location['y']?+?size['height'])?*?1.25)
          )

          i?=?Image.open('./page.png')
          code_img_name?=?'./code.png'
          #?crop根據(jù)rangle元組內(nèi)的坐標(biāo)進(jìn)行裁剪
          frame?=?i.crop(rangle)
          frame.save(code_img_name)

          #?縮小圖片,寬為169,高為216
          code?=?Image.open('./code.png')
          small_img?=?code.resize((169,?216))
          small_img.save('./small_img.png')
          print(code.size,?small_img.size)

          3.2方法二、通過網(wǎng)頁獲取圖片地址,并保存

          這種方法比上一種更加方便,分析網(wǎng)頁源碼獲取圖片地址,對該地址發(fā)送請求,接收返回的二進(jìn)制文件,進(jìn)行保存。首先打開網(wǎng)頁源碼找到圖片地址。

          圖片地址是img標(biāo)簽的src屬性值,通過xpath得到地址,直接對此url發(fā)送請求,接收數(shù)據(jù)并保存即可。

          「注意:」 由于獲取的圖片的高度仍然大于超級鷹標(biāo)準(zhǔn)格式,所以也需要將圖片縮小。
          「代碼實(shí)現(xiàn):」
          #?本文相關(guān)完整代碼可以關(guān)注微信公眾號:簡說Python,回復(fù):B站?獲取。
          #?獲取img標(biāo)簽的src屬性值
          img_url?=?bro.find_element_by_xpath('/html/body/div[2]/div[2]/div[6]/div/div/div[2]/div[1]/div/div[2]/img').get_attribute('src')
          headers?=?{
          ????'Users-Agent':?'Mozilla/5.0?(Windows?NT?6.1;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/79.0.3945.117?Safari/537.36'
          }
          #?獲取圖片二進(jìn)制數(shù)據(jù)
          img_data?=?requests.get(url=img_url,?headers=headers).content
          with?open('./node1.png',?'wb')as?fp:
          ????fp.write(img_data)
          i?=?Image.open('./node1.png')
          #?將圖片縮小并保存,設(shè)置寬為172,高為192
          small_img?=?i.resize((172,?192))
          small_img.save('./small_img1.png')

          4 使用超級鷹識別驗(yàn)證碼

          這部分沒什么說的,直接調(diào)用就行。
          「代碼如下:」
          #?本文相關(guān)完整代碼可以關(guān)注微信公眾號:簡說Python,回復(fù):B站?獲取。
          #?將驗(yàn)證碼提交給超級鷹進(jìn)行識別
          chaojiying?=?Chaojiying_Client('用戶名',?'密碼',?'96001')??#?用戶中心>>軟件ID?生成一個(gè)替換?96001
          im?=?open('small_img.png',?'rb').read()??#?本地圖片文件路徑?來替換?a.jpg?有時(shí)WIN系統(tǒng)須要//
          #?9004是驗(yàn)證碼類型
          print(chaojiying.PostPic(im,?9004)['pic_str'])
          result?=?chaojiying.PostPic(im,?9004)['pic_str']

          5 對獲取的坐標(biāo)數(shù)據(jù)進(jìn)行提取,并用動作鏈完成點(diǎn)擊

          超級鷹識別返回的數(shù)據(jù)格式是:123,12 | 234,21。
          我們可以將數(shù)據(jù)以' | '進(jìn)行分割,保存到列表中,再以逗號分割將x,y的坐標(biāo)保存,得到[ [123,12],[234,21] ]這一格式,然后遍歷這一列表,使用動作鏈對每一個(gè)列表元素對應(yīng)的x,y指定的位置進(jìn)行點(diǎn)擊操作,最后定位并點(diǎn)擊確認(rèn),登錄成功。

          「代碼實(shí)現(xiàn):」

          #?本文相關(guān)完整代碼可以關(guān)注微信公眾號:簡說Python,回復(fù):B站?獲取。
          all_list?=?[]??#?要存儲即將被點(diǎn)擊的點(diǎn)的坐標(biāo)??[[x1,y1],[x2,y2]]
          if?'|'?in?result:
          ????list_1?=?result.split('|')
          ????count_1?=?len(list_1)
          ????for?i?in?range(count_1):
          ????????xy_list?=?[]
          ????????x?=?int(list_1[i].split(',')[0])
          ????????y?=?int(list_1[i].split(',')[1])
          ????????xy_list.append(x)
          ????????xy_list.append(y)
          ????????all_list.append(xy_list)
          else:
          ????x?=?int(result.split(',')[0])
          ????y?=?int(result.split(',')[1])
          ????xy_list?=?[]
          ????xy_list.append(x)
          ????xy_list.append(y)
          ????all_list.append(xy_list)

          #?遍歷列表,使用動作鏈對每一個(gè)列表元素對應(yīng)的x,y指定的位置進(jìn)行點(diǎn)擊操作
          #?x,y坐標(biāo)乘2和0.8,是由于
          for?l?in?all_list:
          ????x?=?l[0]?*?2?*?0.8
          ????y?=?l[1]?*?2?*?0.8
          ????#?將點(diǎn)擊操作的參照物移動到指定的模塊,
          ????#?若用方法二獲取的驗(yàn)證碼圖片,要添加下面代碼對code_img_ele賦值
          ????#?code_img_ele?=?bro.find_element_by_xpath('/html/body/div[2]/div[2]/div[6]/div/div/div[2]/div[1]/div/div[2]/img')
          ????ActionChains(bro).move_to_element_with_offset(code_img_ele,?x,?y).click().perform()
          ????sleep(0.1)
          ????print('點(diǎn)擊已完成')

          #?完成動作鏈點(diǎn)擊操作后,定位確認(rèn)按鈕并點(diǎn)擊
          bro.find_element_by_xpath('/html/body/div[2]/div[2]/div[6]/div/div/div[3]/a').click()

          更多閱讀



          2020 年最佳流行 Python 庫 Top 10


          2020 Python中文社區(qū)熱門文章 Top 10


          5分鐘快速掌握 Python 定時(shí)任務(wù)框架

          特別推薦




          點(diǎn)擊下方閱讀原文加入社區(qū)會員

          瀏覽 95
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  最新最近日本中文字幕不亚洲 | 日韩精品一区二区三区av | 千百撸日夜夜 | 熟妇三区 | 男女一区二区 |