如何分析Spark3大數(shù)據(jù)實(shí)時(shí)處理Streaming+StructuredStreaming的實(shí)戰(zhàn)

如何分析Spark3大數(shù)據(jù)實(shí)時(shí)處理Streaming+Structured Streaming 的實(shí)戰(zhàn),相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

目前創(chuàng)新互聯(lián)建站已為上1000家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、網(wǎng)站托管運(yùn)營(yíng)、企業(yè)網(wǎng)站設(shè)計(jì)、泰安網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶(hù)導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶(hù)和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

Spark3大數(shù)據(jù)實(shí)時(shí)處理-Streaming+Structured Streaming 實(shí)戰(zhàn)

requests模擬登錄12306

1、開(kāi)局閑聊

昨天下午準(zhǔn)備隨便找找高鐵票時(shí),突然對(duì)12306的登錄產(chǎn)生了興趣,于是研究了一下,先說(shuō)明兩點(diǎn):

  • 驗(yàn)證碼
    這部分調(diào)用的是一個(gè)大佬現(xiàn)成的API,如果各位大佬對(duì)識(shí)別驗(yàn)證碼部分感興趣,我這個(gè)小菜雞很抱歉幫不上忙

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

既然沒(méi)什么難點(diǎn),那有人可能就問(wèn)了為什么還要水一篇文章?

原因就是12306登錄過(guò)程中還是有不少坑,雖然單個(gè)頁(yè)面請(qǐng)求字段少,但頂不住一個(gè)登錄請(qǐng)求居然有十來(lái)個(gè)請(qǐng)求頁(yè)面,在這個(gè)過(guò)程中各種自動(dòng)手動(dòng)設(shè)置Cookie,如果你憨憨的只請(qǐng)求登錄url是永遠(yuǎn)失敗的(別問(wèn)我怎么知道的?。?,浪費(fèi)我好幾個(gè)小時(shí)時(shí)間。

2、準(zhǔn)備工具

  • 瀏覽器開(kāi)發(fā)者工具

  • Fiddler或Charles等抓包工具
    建議使用抓包工具,因?yàn)檎?qǐng)求太多時(shí)控制臺(tái)不是很直觀,控制臺(tái)主要用于JS調(diào)試,雖然登錄12306基本不需要用到調(diào)試

3、請(qǐng)求分析

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

3.1 獲取驗(yàn)證碼

生成驗(yàn)證碼的URL很容易找到

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

請(qǐng)求字段
如何分析Spark3大數(shù)據(jù)實(shí)時(shí)處理Streaming+Structured Streaming 的實(shí)戰(zhàn)
響應(yīng)image就是經(jīng)過(guò)base64驗(yàn)證碼圖片,驗(yàn)證碼圖片從這里就可以拿到了
重點(diǎn)說(shuō)Cookie,雖然字段有點(diǎn)多,但其實(shí)只要關(guān)注使用JS手動(dòng)設(shè)置的字段就可以了,因?yàn)镾ession會(huì)幫我們處理響應(yīng)頭里的Cookie,重點(diǎn)就是確定哪些字段不是通過(guò)響應(yīng)頭設(shè)置的,可以直接搜索字段,比如第一個(gè)_passport_session
如何分析Spark3大數(shù)據(jù)實(shí)時(shí)處理Streaming+Structured Streaming 的實(shí)戰(zhàn)
在一個(gè)JS文件中出現(xiàn)了該字段,這表明是手動(dòng)添加的,需要重點(diǎn)關(guān)注,既然是手動(dòng)添加的字段要么是JS計(jì)算生成要么是服務(wù)器響應(yīng),可以先找找字段值
如何分析Spark3大數(shù)據(jù)實(shí)時(shí)處理Streaming+Structured Streaming 的實(shí)戰(zhàn)
首先分析響應(yīng)有三個(gè)字段exp、cookieCode和dfp,經(jīng)比對(duì)exp和dfp就是驗(yàn)證碼請(qǐng)求Cookie中的RAIL_EXPIRATION和RAIL_DEVICEID
其次看看這個(gè)請(qǐng)求本身:

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

請(qǐng)求參數(shù)雖然有很多,但瀏覽器打開(kāi)是可以直接響應(yīng)結(jié)果的,所以暫且不管它,實(shí)際上這些參數(shù)的生成過(guò)程還是有點(diǎn)意思的,過(guò)兩天我會(huì)專(zhuān)門(mén)寫(xiě)一篇分析這部分JS參數(shù)的文章,現(xiàn)在我們直接使用訪問(wèn)拿到的結(jié)果就能通過(guò)
回到獲取驗(yàn)證碼的請(qǐng)求cookie上來(lái),經(jīng)過(guò)分析發(fā)現(xiàn)除開(kāi)RAIL_EXPIRATION和RAIL_DEVICEID其他字段都是響應(yīng)頭設(shè)置的,所以在獲取驗(yàn)證碼圖片這一步我們只需要進(jìn)行兩個(gè)請(qǐng)求:

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這些字段其實(shí)基本就是獲取設(shè)備信息再進(jìn)行加密處理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)
}# 第一次請(qǐng)求獲取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)    # 這個(gè)字段暫時(shí)不確定作用session.cookies.update({'RAIL_DEVICEID': dfp, 'RAIL_EXPIRATION': exp})  # 手動(dòng)添加cookie# 第二次請(qǐng)求獲取驗(yàn)證碼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)

驗(yàn)證碼圖片就成功拿到了

3.2 提交驗(yàn)證結(jié)果

如何分析Spark3大數(shù)據(jù)實(shí)時(shí)處理Streaming+Structured Streaming 的實(shí)戰(zhàn)
先隨便在驗(yàn)證碼圖片上點(diǎn)一下,然后右鍵檢查元素

發(fā)現(xiàn)當(dāng)在圖片上標(biāo)記一個(gè)點(diǎn),頁(yè)面就會(huì)生成一個(gè)div標(biāo)簽,很簡(jiǎn)單就能推測(cè)出randcode就是提交答案,它的數(shù)值就是圖片所在的平面位置點(diǎn),我們可以隨意的在8個(gè)圖中取一個(gè)點(diǎn)作為第幾張圖的映射,如

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):"""調(diào)用API接口獲取驗(yàn)證碼結(jié)果
    :param path: 驗(yàn)證碼圖片路徑
    :return:
    """url = "http://littlebigluo.qicp.net:47720/"ret = []# 發(fā)送post請(qǐng)求把圖片數(shù)據(jù)帶上file = open(path, 'rb')
    response = requests.post(url, data={"type": "1",},
                             files={'pic_xxfile': file})
    file.close()# 返回識(shí)別結(jié)果for i in re.findall("<B>(.*)</B>", response.text)[0].split(" "):
        ret.append(position[int(i)])return ret

接下來(lái)調(diào)用上面的識(shí)別函數(shù)獲取答案

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大數(shù)據(jù)實(shí)時(shí)處理Streaming+Structured Streaming 的實(shí)戰(zhàn)
Cookie和響應(yīng),都是老東西中規(guī)中矩沒(méi)有需要注意的

看完上述內(nèi)容,你們掌握如何分析Spark3大數(shù)據(jù)實(shí)時(shí)處理Streaming+Structured Streaming 的實(shí)戰(zhàn)的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

本文標(biāo)題:如何分析Spark3大數(shù)據(jù)實(shí)時(shí)處理Streaming+StructuredStreaming的實(shí)戰(zhàn)
網(wǎng)站鏈接:http://www.muchs.cn/article34/ishjse.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、外貿(mào)網(wǎng)站建設(shè)、品牌網(wǎng)站制作全網(wǎng)營(yíng)銷(xiāo)推廣、App開(kāi)發(fā)營(yíng)銷(xiāo)型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)