爬蟲案例(六)

安男i發表於2020-11-03

1.selenium手動打碼

from selenium import webdriver


'''
問題一:
   如果出現警示框,需要點選確認
   解決方法:點選確認
   切入警示框中並點選確定
   driver.switch_to.alert.accept()
問題二:
    如果配置好IE之後,出現驗證證照的問題:
    解決:執行下面程式碼
    driver.execute_script("javascript:document.getElementById('overridelink').click()")
問題三:
    配置好之後,內容也輸入了,但是,無法點選查驗按鈕
    解決:使用js點選
    driver.execute_script("document.getElementById('checkfp').click()")
問題四:
    配置好之後,報錯:xxx On CLOSED WINDOW
    解決一:檢查IE遊覽器的配置:安全性---> 檢查登錄檔-->selenium版本和IE驅動的版本是否一致
    解決二: 到登錄檔中 把 iexplorer.exe 名字 改成  iexplore.exe 
    解決三:選中IE遊覽器internet選項--->點選高階-->點選還原高階設定-->點選重置-->

'''
# 呼叫IE遊覽器
driver = webdriver.Ie(executable_path=r'D:\pachong\軟體\IEDriverServer.exe')

# 傳送請求
driver.get(url='https://inv-veri.chinatax.gov.cn/')

# 查詢發票程式碼並輸入
fpdm = driver.find_element_by_id("fpdm").send_keys('011002000211')

#查詢發票號碼並輸入
fplm = driver.find_element_by_id("fphm").send_keys('67866062')

#查詢開票日期並輸入
kprq = driver.find_element_by_id("kprq").send_keys('20200721')

#輸入校驗碼後6位     119902
kjje = driver.find_element_by_id('kjje').send_keys('119902')

# 輸入驗證碼
yzm = input('請輸入驗證碼:')
driver.find_element_by_id("yzm").send_keys(yzm)
driver.find_element_by_id("checkfp").click()

2.超級鷹打碼平臺

'''
超級鷹打碼平臺 http://www.chaojiying.com/

使用
賬號 Zzzzp123456
密碼 zp7512799
註冊 --->登入--->開發文件-->選擇python-->跨平臺HTTP WEB介面

1.請求 POST
url:   http://upload.chaojiying.net/Upload/Processing.php


引數:

user=使用者賬號
pass=使用者密碼 //或 pass2=使用者密碼的md5值(32位小寫)
softid=軟體ID  在使用者中心,軟體ID處可以生成
codetype=驗證碼型別   在價格體系中選用一個適合的型別 點選這裡進入
len_min=最小位數 //預設0為不啟用,圖片型別為可變位長時可啟用這個引數
userfile=圖片檔案二進位制流(或是稱之為記憶體流,檔案流,位元組流的概念)
file_base64=圖片檔案base64字串

'''
import requests,base64

# 開啟檔案
fp = open('xiazai.jpg','rb')
img = base64.b64encode(fp.read())
#關閉檔案
fp.close()

data={
    'user':'985RJC',
    'pass':'Rongjichen110119',
    'softid':'8ffc380a1b7a54e51d0de739cb292466',
    'codetype':'1004',
    'file_base64':img
}
response = requests.post(url='http://upload.chaojiying.net/Upload/Processing.php',data=data)
#獲取驗證碼
print(response.json()['pic_str'])

3.RDA財務機器人
‘’’

API Key : SgBvVbREKA7oM2VcmcCeDp5e

Secret Key: MSfcx3G9C6691rWSpaUxr09zwZlhMsWZ




'''

import requests
import base64
from selenium import  webdriver
from PIL import Image

#定義獲取access_token函式
def get_token():
    host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=SgBvVbREKA7oM2VcmcCeDp5e&client_secret=MSfcx3G9C6691rWSpaUxr09zwZlhMsWZ'
    response =requests.get(host)
    if response:
        return response.json()['access_token']
    ...

def shibie(token):
    request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/vat_invoice"
    # 二進位制方式開啟圖片檔案
    f = open('fapiao.png', 'rb')
    img = base64.b64encode(f.read())

    params = {"image":img}
    request_url = request_url + "?access_token=" + token
    headers = {'content-type': 'application/x-www-form-urlencoded'}
    response = requests.post(request_url, data=params, headers=headers)
    if response:
        content = response.json()['words_result']
        # 獲取發票程式碼
        InvoiceCode = content['InvoiceCode']
        # 獲取發票號碼
        InvoiceNum = content['InvoiceNum']
        # 獲取開票日期
        InvoiceDate = content['InvoiceDate']
        # 獲取校驗碼
        CheckCode = content['CheckCode']
        return InvoiceCode, InvoiceNum, InvoiceDate, CheckCode

#定義查驗函式
def start_check(detail):
    # 呼叫IE遊覽器
    driver = webdriver.Ie(executable_path=r'D:\pachong\軟體\IEDriverServer.exe')

    # 訪問頁面
    driver.get(url='https://inv-veri.chinatax.gov.cn/')
    # 查詢發票程式碼並輸入
    driver.find_element_by_id('fpdm').send_keys(detail[0])

    # 查詢發票號碼並輸入
    driver.find_element_by_id('fphm').send_keys(detail[1])

    # 查詢開票日期並輸入
    date = detail[2].replace('年', '').replace('月', '').replace('日', '')
    driver.find_element_by_id('kprq').send_keys(date)

    # 查詢校驗碼並輸入
    driver.find_element_by_id('kjje').send_keys(detail[3][-6:])

    # 輸入驗證碼:對接打碼平臺,打碼平臺接收圖片
    # 截圖
    driver.save_screenshot('yzm.png')

    # 區域性截圖
    # 開啟圖片
    im = Image.open('yzm.png')
    # 進行區域性截圖
    # crop()接收元組:(左,上,右,下)
    im = im.crop((710, 490, 1200, 610))
    # 儲存區域性截圖
    im.save('jubu.png')

    # 呼叫打碼平臺
    yzm = dama()

    # 查詢並輸入驗證碼
    driver.find_element_by_id('yzm').send_keys(yzm)

    # 查詢並點選查驗按鈕
    driver.find_element_by_id('checkfp').click()

# 定義打碼平臺函式
def dama():
    # 讀取檔案
    fp = open('jubu.png', 'rb')
    image = base64.b64encode(fp.read())
    # 關閉檔案
    fp.close()
    data = {
        'user': '985RJC',
        'pass': 'Rongjichen110119',
        'softid': '8ffc380a1b7a54e51d0de739cb292466',
        'codetype': '1004',
        'file_base64': image
    }
    response = requests.post(url='http://upload.chaojiying.net/Upload/Processing.php', data=data)
    # 獲取驗證碼
    print(response.json()['pic_str'])
    return response.json()['pic_str']
if __name__ == '__main__':
    token = get_token()
    detail = shibie(token)
    start_check(detail)
    ...

4.豆瓣登入

#需求:破解滑塊驗證碼
import time

from selenium import  webdriver

#匯入動作練
from selenium.webdriver.common.action_chains import ActionChains
# 呼叫遊覽器
driver = webdriver.Chrome(executable_path=r'C:\Users\Administrator\Downloads\chromedriver.exe')

#請求url
driver.get(url='https://www.douban.com/')
#0代表第一個iframe標籤
driver.switch_to.frame(0)
# 獲取點選密碼登入
driver.find_element_by_xpath('/html/body/div[1]/div[1]/ul[1]/li[2]').click()
# 獲取並輸入賬號
driver.find_element_by_id("username").send_keys('18524158889')
#獲取輸入錯的密碼
driver.find_element_by_id('password').send_keys('332er23r')
#獲取登入賬號並且點選登入 出現滑塊
driver.find_element_by_xpath('/html/body/div[1]/div[2]/div[1]/div[5]/a').click()

# 1.獲取滑塊
time.sleep(5)
driver.switch_to.frame(1)
huakuai = driver.find_element_by_id("tcaptcha_drag_thumb")

#拖動滑塊 保持執行
ActionChains(driver).click_and_hold(on_element=huakuai).perform()

#移動距離
ActionChains(driver).move_by_offset(xoffset=177,yoffset=0).perform()

#釋放滑鼠
# ActionChains(driver).release().perform()\
def get_tracks(distance):
    """
    勻變速公式:
    v = v0 + at
    x = v0t + 1/2 * a*t**2
    """
    # 定義初速度
    v = 0
    # 定義單位時間
    t = 0.6
    # 定義加速運動和減速運動的分界線
    mid = distance * 4/5
    # 定義當前位移
    current = 0
    # 定義運動軌跡列表
    tracks = []
    # 為了一直移動
    while current < distance:
        if mid > current:
            # 定義加速運動的加速度
            a = 2
        else:
            # 定義減速運動的加速度
            a = -3
        v0 = v
        # 計算位移
        x = v0*t + 1/2*a*t**2
        # 計算當前位移
        current += x
        # 計算每一次移動的末速度
        v = v0 + a*t
        tracks.append(round(x))
    return tracks

tracks = get_tracks(100)

for track in tracks:
    ActionChains(driver).move_by_offset(xoffset=track,yoffset=0).perform()

time.sleep(1)
# 釋放滑鼠
ActionChains(driver).release().perform()

相關文章