日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

pyppeteer 登录一般网站 并利用 http方法获取登录页面的验证码

發布時間:2023/12/13 综合教程 19 生活家
生活随笔 收集整理的這篇文章主要介紹了 pyppeteer 登录一般网站 并利用 http方法获取登录页面的验证码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

主函數

新建瀏覽器,進行登錄,由于驗證碼的識別準確率不是百分之百,需要多次嘗試。

    async def main(self, username, pwd, url):  # 定義main協程函數,

        login_count = 0

        # 打開瀏覽器
        browser = await launch(
            {'headless': False, "userDataDir": r"./temp_data", 'args': ['--no-sandbox'], })

        # 登錄檢測
        while login_count < 10:
            # 登錄
            await self.login(browser, username, pwd, url)

            # 檢測是否登錄成功
            if await self.check_login(browser):
                break
            else:
                login_count += 1

        # 嘗試登錄次數大于10就退出
        if login_count > 10:
            print("login failed!")
            await browser.close()
            return
		
		do_something()

        await browser.close()
		

登錄函數

可以替換程序中驗證操作函數,實現不同的驗證方式。
其中提交過程采用了xpath定位提交按鈕。

    async def login(self, browser, username, pwd, url):
        page = await browser.newPage()  # 啟動個新的瀏覽器頁面
        await page.setUserAgent(
            'Mozilla/5.0 (Windows NT 6.1; WOW64) '
            'AppleWebKit/537.36 (KHTML, like Gecko) '
            'Chrome/68.0.3440.106 Safari/537.36')

        await page.goto(url)  # 訪問登錄頁面

        # 就是在瀏覽器運行的時候,始終讓window.navigator.webdriver=false
        # navigator是windiw對象的一個屬性,同時修改plugins,languages,navigator 且讓
        await page.evaluate(
            '''() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }) }''')

        # 以下為插入中間js,將淘寶會為了檢測瀏覽器而調用的js修改其結果。
        await page.evaluate('''() =>{ window.navigator.chrome = { runtime: {},  }; }''')
        await page.evaluate('''() =>{ Object.defineProperty(navigator,
         'languages', { get: () => ['en-US', 'en'] }); }''')
        await page.evaluate('''() =>{ Object.defineProperty(navigator, 
         'plugins', { get: () => [1, 2, 3, 4, 5,6], }); }''')
         
        time.sleep(2)
        
        # 使用type選定頁面元素,并修改其數值,用于輸入賬號密碼,修改的速度仿人類操作,因為有個輸入速度的檢測機制
        # 因為 pyppeteer 框架需要轉換為js操作,而js和python的類型定義不同,所以寫法與參數要用字典,類型導入
        await page.type('#username', username, {'delay': self.input_time_random() - 50})
        await page.type('#password', pwd, {'delay': self.input_time_random()})

        # await page.screenshot({'path': './picture/headless-test-result.png'})    # 截圖測試

        time.sleep(1)
        
        # 驗證碼操作
		verification_code(page);

        # 點擊提交
        submit = await page.xpath("http://button[@class='auth_login_btn primary full_width']")
        await submit[0].click()

        time.sleep(1)

驗證碼識別和輸入

我在這里利用了某網站的驗證碼識別api,通過http方式就能上傳驗證碼圖片,并獲取驗證碼。這個網站每天有固定的1000張圖片免費次數,足夠我們使用。第一個請求鏈接的用戶名和密碼換成我們注冊該網站的用戶名和密碼即可。具體可以看官方的API文檔。
該網站地址:http://fast.95man.com/

    # 驗證碼登錄
    async def verification_code(self, page):
        await page.waitFor(5 * 1000)                                     # 等待驗證碼圖片加載
        yazhengma = await page.waitForSelector('#captchaImg')            # 定位驗證碼元素
        await yazhengma.screenshot({'path': './picture/yazhengma.png'})  # 保存驗證碼圖片

        # 獲取驗證碼
        code = self.get_code('./picture/yazhengma.png')

        # 輸入驗證碼
        await page.type('#captchaResponse', code, {'delay': self.input_time_random()})

    def get_code(self, file_path):
            # 以下為GET請求
            url = 'http://api.95man.com:8888/api/Http/UserTaken?user=username&pwd=password&isref=0'
            token_request = requests.get(url)
            token_raw = str(token_request.content)

            # 切片獲取token
            token = token_raw[4: -1]

            print(token)

            # 發送圖片解析請求
            url = "http://api.95man.com:8888/api/Http/Recog?Taken=" + token + "&imgtype=1&len=4"
            file_path = file_path
            files = {'file': open(file_path, 'rb')}

            # 上傳圖片
            r = requests.post(url, files=files)
            print(r.url, r.text)

            # 切片獲取驗證碼
            return r.text[6:10]

參考

本文中的驗證碼像素級保存和獲取登錄頁面時的反反爬操作是參考了別人的博客完成的。

https://www.jianshu.com/p/4dd2737a3048
https://www.jianshu.com/p/a4c4935d5dd7
http://fast.95man.com/auth/quickchk.html

總結

以上是生活随笔為你收集整理的pyppeteer 登录一般网站 并利用 http方法获取登录页面的验证码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。