亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何分析Spark3大數據實時處理Streaming+Structured Streaming 的實戰

發布時間:2021-12-17 10:07:45 來源:億速云 閱讀:232 作者:柒染 欄目:云計算

如何分析Spark3大數據實時處理Streaming+Structured Streaming 的實戰,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

Spark3大數據實時處理-Streaming+Structured Streaming 實戰

requests模擬登錄12306

1、開局閑聊

昨天下午準備隨便找找高鐵票時,突然對12306的登錄產生了興趣,于是研究了一下,先說明兩點:

  • 驗證碼
    這部分調用的是一個大佬現成的API,如果各位大佬對識別驗證碼部分感興趣,我這個小菜雞很抱歉幫不上忙

  • 登錄表單
    實際上12306登錄的表單十分簡單,字段少JS代碼基本沒什么難度,所以想看高階JS逆向的姐姐可能要失望了

既然沒什么難點,那有人可能就問了為什么還要水一篇文章?

原因就是12306登錄過程中還是有不少坑,雖然單個頁面請求字段少,但頂不住一個登錄請求居然有十來個請求頁面,在這個過程中各種自動手動設置Cookie,如果你憨憨的只請求登錄url是永遠失敗的(別問我怎么知道的!),浪費我好幾個小時時間。

2、準備工具

  • 瀏覽器開發者工具

  • Fiddler或Charles等抓包工具
    建議使用抓包工具,因為請求太多時控制臺不是很直觀,控制臺主要用于JS調試,雖然登錄12306基本不需要用到調試

3、請求分析

首先運行抓包工具監聽,在瀏覽器打開12306的主頁手動登錄一次,登錄成功后就可以抓包監聽了,我這里用的是Charles
如何分析Spark3大數據實時處理Streaming+Structured Streaming 的實戰
顯示的結果有很多,但是不要怕,大部分都是靜態文件,除掉靜態文件其他相關請求大概也就十五六個...
我一開始被N次登錄失敗搞上頭了總覺得12306在請求上埋坑于是還真按著這十多個請求一路寫下去...
后來想想其實沒必要這么做,關注主要的幾個登錄請求中的Cookie字段來源再針對性發出請求就好了,事后也證明只需要經過6個請求,就能成功登錄。
所以本文我會著手從關鍵的幾個登錄請求分析,就不贅述摸索過程的痛了。

3.1 獲取驗證碼

生成驗證碼的URL很容易找到

https://kyfw.12306.cn/passport/captcha/captcha-image64?login_site=E&module=login&rand=sjrand&1589797925252&callback=jQuery191020097810026343454_1589797924079&_=1589797924080

請求字段
如何分析Spark3大數據實時處理Streaming+Structured Streaming 的實戰
響應image就是經過base64驗證碼圖片,驗證碼圖片從這里就可以拿到了
重點說Cookie,雖然字段有點多,但其實只要關注使用JS手動設置的字段就可以了,因為Session會幫我們處理響應頭里的Cookie,重點就是確定哪些字段不是通過響應頭設置的,可以直接搜索字段,比如第一個_passport_session
如何分析Spark3大數據實時處理Streaming+Structured Streaming 的實戰
在一個JS文件中出現了該字段,這表明是手動添加的,需要重點關注,既然是手動添加的字段要么是JS計算生成要么是服務器響應,可以先找找字段值
如何分析Spark3大數據實時處理Streaming+Structured Streaming 的實戰
首先分析響應有三個字段exp、cookieCode和dfp,經比對exp和dfp就是驗證碼請求Cookie中的RAIL_EXPIRATION和RAIL_DEVICEID
其次看看這個請求本身:

https://kyfw.12306.cn/otn/HttpZF/logdevice?algID=y6fvmhGlLP&hashCode=WRXET1wCtYsDWujgBBDiq2A4aqJOy-G6t5VK5OI0wNY&FMQw=0&q4f3=zh-CN&VPIf=1&custID=133&VEek=unknown&dzuS=0&yD16=0&EOQP=c227b88b01f5c513710d4b9f16a5ce52&jp76=52d67b2a5aa5e031084733d5006cc664&hAqN=MacIntel&platform=WEB&ks0Q=d22ca0b81584fbea62237b14bd04c866&TeRS=709x1280&tOHY=24xx800x1280&Fvje=i1l1o1s1&q5aJ=-8&wNLf=99115dfb07133750ba677d055874de87&0aew=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36&E3gR=92271eade53193a7130e280652b8e939&timestamp=1589810100160

請求參數雖然有很多,但瀏覽器打開是可以直接響應結果的,所以暫且不管它,實際上這些參數的生成過程還是有點意思的,過兩天我會專門寫一篇分析這部分JS參數的文章,現在我們直接使用訪問拿到的結果就能通過
回到獲取驗證碼的請求cookie上來,經過分析發現除開RAIL_EXPIRATION和RAIL_DEVICEID其他字段都是響應頭設置的,所以在獲取驗證碼圖片這一步我們只需要進行兩個請求:

import reimport requests
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36','Referer': 'https://kyfw.12306.cn/otn/resources/login.html','Host': 'kyfw.12306.cn'}

session = requests.Session()# p1這些字段其實基本就是獲取設備信息再進行加密處理p1 = {'algID': 'y6fvmhGlLP','hashCode': 'WRXET1wCtYsDWujgBBDiq2A4aqJOy-G6t5VK5OI0wNY','FMQw': 0,'q4f3': 'zh-CN','VPIf': 1,'custID': 133,'VEek': 'unknown','dzuS': 0,'yD16': 0,'EOQP': 'c227b88b01f5c513710d4b9f16a5ce52','jp76': '52d67b2a5aa5e031084733d5006cc664','hAqN': 'MacIntel','platform': 'WEB','ks0Q': 'd22ca0b81584fbea62237b14bd04c866','TeRS': '709x1280','tOHY': '24xx800x1280','Fvje': 'i1l1o1s1','q5aJ': '-8','wNLf': '99115dfb07133750ba677d055874de87','0aew': headers['User-Agent'],'E3gR': '92271eade53193a7130e280652b8e939','timestamp': int(time.time() * 1000)
}# 第一次請求獲取exp和dfpr1 = session.get('https://kyfw.12306.cn/otn/HttpZF/logdevice', params=p1, headers=headers)
exp = re.search(r'exp":"(\d+)",', r1.text).group(1)
dfp = re.search(r'dfp":"(.+?)"', r1.text).group(1)
cookieCode = re.search(r'cookieCode":"(.+?)"', r1.text).group(1)    # 這個字段暫時不確定作用session.cookies.update({'RAIL_DEVICEID': dfp, 'RAIL_EXPIRATION': exp})  # 手動添加cookie# 第二次請求獲取驗證碼p2 = {'login_site': 'E','module': 'login','rand': 'sjrand',str(int(time.time() * 1000)): ''}
r2 = session.get('https://kyfw.12306.cn/passport/captcha/captcha-image64', params=p2)
image = re.search(r'image":"(.+?)",', r2.text).group(1)

驗證碼圖片就成功拿到了

3.2 提交驗證結果

如何分析Spark3大數據實時處理Streaming+Structured Streaming 的實戰
先隨便在驗證碼圖片上點一下,然后右鍵檢查元素

發現當在圖片上標記一個點,頁面就會生成一個div標簽,很簡單就能推測出randcode就是提交答案,它的數值就是圖片所在的平面位置點,我們可以隨意的在8個圖中取一個點作為第幾張圖的映射,如

position = {1: '49,48', 2: '124,52', 3: '200,43', 4: '259,47',5: '50,113', 6: '101,102', 7: '198,112', 8: '250,127'}def getVerifyResult(path: str):"""調用API接口獲取驗證碼結果
    :param path: 驗證碼圖片路徑
    :return:
    """url = "http://littlebigluo.qicp.net:47720/"ret = []# 發送post請求把圖片數據帶上file = open(path, 'rb')
    response = requests.post(url, data={"type": "1",},
                             files={'pic_xxfile': file})
    file.close()# 返回識別結果for i in re.findall("<B>(.*)</B>", response.text)[0].split(" "):
        ret.append(position[int(i)])return ret

接下來調用上面的識別函數獲取答案

import base64
code_path = "code.jpg"imgdata = base64.b64decode(image)with open(code_path, 'wb') as f:
    f.write(imgdata)
capchat = getVerifyResult(code_path)
answer = ','.join(capchat)

如何分析Spark3大數據實時處理Streaming+Structured Streaming 的實戰
Cookie和響應,都是老東西中規中矩沒有需要注意的

看完上述內容,你們掌握如何分析Spark3大數據實時處理Streaming+Structured Streaming 的實戰的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

裕民县| 正阳县| 盐山县| 衡东县| 宁阳县| 长岭县| 岳西县| 衢州市| 临邑县| 长白| 舞阳县| 宣武区| 马山县| 铜山县| 民勤县| 聊城市| 桂平市| 新平| 安吉县| 赫章县| 定兴县| 临泉县| 陆川县| 平南县| 昌都县| 定边县| 新龙县| 曲水县| 泸溪县| 雅安市| 霍山县| 板桥市| 黎平县| 沂水县| 迭部县| 陆川县| 安平县| 河池市| 葵青区| 红安县| 临泽县|