1. 程式人生 > 其它 >python爬蟲學習(7)

python爬蟲學習(7)

技術標籤:python爬蟲學習python

python爬蟲學習(待完成)

記錄時間:2021年2月7日

學習視訊觀看地址:https://www.bilibili.com/video/BV1Yh411o7Sz?p=55

需求1:12306模擬登入

在這個操作時,我們需要識別類似於這樣的驗證碼:

,需要使用第三方平臺進行識別(例如:超級鷹)。

超級鷹介面部分的程式碼簡單測試:

import requests
from hashlib import md5


class Chaojiying_Client(object):

    def __init__(self, username, password, soft_id):
        self.username = username
        password = password.encode('utf8')
        self.password = md5(password).hexdigest()
        self.soft_id = soft_id
        self.base_params = {
            'user': self.username,
            'pass2': self.password,
            'softid': self.soft_id,
        }
        self.headers = {
            'Connection': 'Keep-Alive',
            'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
        }

    def PostPic(self, im, codetype):
        """
        im: 圖片位元組
        codetype: 題目型別 參考 http://www.chaojiying.com/price.html
        """
        params = {
            'codetype': codetype,
        }
        params.update(self.base_params)
        files = {'userfile': ('ccc.jpg', im)}
        r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files,
                          headers=self.headers)
        return r.json()

    def ReportError(self, im_id):
        """
        im_id:報錯題目的圖片ID
        """
        params = {
            'id': im_id,
        }
        params.update(self.base_params)
        r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
        return r.json()


if __name__ == '__main__':
    chaojiying = Chaojiying_Client('xxxxxxxx', 'xxxxxxxx', 'xxxxx')  # 使用者名稱 密碼 軟體ID
    im = open('b.jpg', 'rb').read()  # 本地圖片檔案路徑
    print(chaojiying.PostPic(im, 9004)['pic_str'])  # 驗證碼型別

另外,由於再次請求驗證碼會導致驗證碼重新整理,所以要採取截圖的方式獲取驗證碼圖片

先寫一半,後面的還沒測試出來,搞懂了再補充

from selenium import webdriver
from PIL import Image
import time

from 超級鷹介面.chaojiying import Chaojiying_Client

if __name__ == '__main__':
    edge = webdriver.Edge('./msedgedriver.exe')
    edge.maximize_window()
    edge.get('https://kyfw.12306.cn/otn/resources/login.html')
    time.sleep(2)
    switch_btn = edge.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a')
    switch_btn.click()

    # 獲取驗證碼圖片,使用截圖
    time.sleep(2)
    edge.save_screenshot('./12306模擬登入/1.png')
    imgCode = edge.find_element_by_xpath('//*[@id="J-loginImg"]')
    location = imgCode.location
    size = imgCode.size
    rangle = (
        int(location['x']), int(location['y']), int(location['x']+size['width']), int(location['y']+size['height'])
    )
    i = Image.open('./12306模擬登入/1.png')
    imgCode_path = './12306模擬登入/imgCode.png'
    frame = i.crop(rangle)
    frame.save(imgCode_path)


    # 提交驗證碼識別出座標
    chaojiying = Chaojiying_Client('xxxxxxxx', 'xxxxxxxx', 'xxxxx')  # 使用者名稱 密碼 軟體ID
    im = open('./12306模擬登入/imgCode.png', 'rb').read()  # 本地圖片檔案路徑
    result = chaojiying.PostPic(im, 9004)['pic_str']  # 驗證碼型別