99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁(yè)大數(shù)據(jù)時(shí)代數(shù)據(jù)搬磚,我竟然沒(méi)動(dòng)手
數(shù)據(jù)搬磚,我竟然沒(méi)動(dòng)手
2021-09-14
收藏

作者:李曉飛

來(lái)源:Python 技術(shù)

今天我來(lái)分享一個(gè)遷移過(guò)程的幕后小故事,有料,有趣,來(lái)聽(tīng)聽(tīng)吧。

并不絲滑

遷移公眾號(hào),是一個(gè)騰訊提供的業(yè)務(wù),就是將原公號(hào)主體切換到另一個(gè)公號(hào)上,然后收回原公號(hào)。

其中大部分是騰訊來(lái)完成的,但還有些工作,需要自己處理,比如遷移公號(hào)的 關(guān)鍵字消息回復(fù)

雖然事情不大,但很重要,做不好,讀者就會(huì)找不見(jiàn)源碼,影響大家學(xué)習(xí)效率。

但單操作起來(lái)還是比較費(fèi)勁的,因?yàn)樾枰瑫r(shí)登錄兩個(gè)公眾號(hào),打開(kāi)兩個(gè)頁(yè)面,來(lái)回切換著操作,很不方便,而且容易搞錯(cuò)。

怎么辦,求神拜佛肯定是沒(méi)有用的,不過(guò)有位大神還真得去拜拜 —— Python!

提取數(shù)據(jù)

既然網(wǎng)頁(yè)上能看到,那么就一定能用爬蟲(chóng)獲取到。

咱們故伎重演,瀏覽器中按下 F12,進(jìn)入魔法世界。

你知道百度的校招啟事就藏在這里嗎?

別說(shuō)是我告訴你的

第一步,先清空請(qǐng)求記錄,刷新頁(yè)面,然后從第一條請(qǐng)求記錄開(kāi)始分析。

實(shí)際上就是看看請(qǐng)求的返回值,是否包含了,頁(yè)面上列表中的數(shù)據(jù)。

幸運(yùn)的是第一條就是,不過(guò)呢,數(shù)據(jù)不是直接給的,而是返回了一個(gè)大 js 腳本,當(dāng)頁(yè)面加載后,運(yùn)算出的。

數(shù)據(jù)搬磚,我竟然沒(méi)動(dòng)手

分析請(qǐng)求

需要勾上 Perserve Log 否則有用頁(yè)面切換可能看不見(jiàn)請(qǐng)求記錄

這個(gè)不是困難,將js復(fù)制出來(lái),提取其中關(guān)鍵字回復(fù)的信息整理一下就可以了。

問(wèn)題是,每頁(yè)只顯示十條,有二十多頁(yè),復(fù)雜的成本有點(diǎn)高呀。

得想想辦法,觀察了一下網(wǎng)址,其中有兩個(gè)參數(shù),一個(gè)是 count,另一個(gè)是 offset,很熟悉呀,不和分頁(yè)參數(shù)是一回事兒?jiǎn)幔?/span>

數(shù)據(jù)搬磚,我竟然沒(méi)動(dòng)手

分析請(qǐng)求

改一下試試,將 count 改為 1000,offset 改為 0,意思是從第一行開(kāi)始,獲取一千條,按下回車 ……

搞定!

仔細(xì)檢查,確實(shí)返回了所有記錄,因?yàn)榭偣惨矝](méi)有一千行。

現(xiàn)在可以蠻干了,因?yàn)榫透梢淮巍?/span>

復(fù)制出來(lái),用文本編輯器(最好支持列編輯)簡(jiǎn)單處理一下,得到一個(gè) json

數(shù)據(jù)搬磚,我竟然沒(méi)動(dòng)手

json

所以方法需要靈活應(yīng)用,如果能直接通過(guò)程序獲取最好,如果不行,手動(dòng)輔助也是可以的。

分析寫入

接下來(lái),才是重頭戲,如何將這些數(shù)據(jù)寫入。

進(jìn)入新公眾號(hào)的管理后臺(tái),新建一個(gè)關(guān)鍵字回復(fù),分析下請(qǐng)求,此時(shí)別忘記,打開(kāi)開(kāi)發(fā)者工具(瀏覽器上按 F12)。

一般提交類請(qǐng)求都是第一個(gè),看一下果然是,不過(guò)肉眼看不清具體數(shù)據(jù),怎么辦?

還記得前面好多次提到的將請(qǐng)求復(fù)制為 curl bash 嗎?對(duì)就用它,在請(qǐng)求上右鍵,選擇 Copy as cURL(bash)

數(shù)據(jù)搬磚,我竟然沒(méi)動(dòng)手

copy cURL

放在哪里呢?當(dāng)然不是放在文本文件里了,除非你是想做一下暫存。

我們直接粘貼到 https://curl.trillworks.com/ 里,可以直接獲得 轉(zhuǎn)化好的 Python 代碼。

然后將 Python 代碼復(fù)制到文件中,執(zhí)行看看效果,果然,新增了一條記錄。

數(shù)據(jù)處理

下面分析請(qǐng)求數(shù)據(jù), 與剛才 json 文件中的做對(duì)比,一般名稱很相近,所以容易找出來(lái)。

字段相同,可能是來(lái)自同一個(gè)架構(gòu)設(shè)計(jì),不太可能出自不同的團(tuán)隊(duì)開(kāi)發(fā),哈哈,我竟然看的這么深!

這樣邊找邊寫,等找完,代碼也就完成了,像這樣:

data = {
  'replytype': 'smartreply',
  'ruleid': '0',
  'rulename': kw['rule_name'], # 規(guī)則名
  'allreply': kw['reply_all'], # 全回復(fù)
  'replycnt': kw['reply_cnt'], # 回復(fù)數(shù)量
  'keywordcnt': len(kw['keyword_list']), # 關(guān)鍵字?jǐn)?shù)量
  'keyword0': kw['keyword_list'][0]['content'], # 關(guān)鍵字
  'matchmode0': kw['keyword_list'][0]['match_mode'], # 匹配模式
  'type0': kw['reply_list'][0]['reply_type'], # 消息類型
  'fileid0': 'undefined',
  'content0': kw['reply_list'][0]['content'], # 回復(fù)內(nèi)容
  'token': '105xxxx502',
  'lang': 'zh_CN',
  'f': 'json',
  'ajax': '1'
}
  • kw 就是從 json 中讀取到的每一行回復(fù)數(shù)據(jù)
  • token 是登錄憑證,如果不傳或錯(cuò)誤,會(huì)創(chuàng)建失敗,說(shuō)明騰訊還是做了很多防護(hù)的

集成

現(xiàn)在將各部分的代碼組合起來(lái)。

首先是解析 json 的代碼:

with open("keyword.js", 'r', encoding='utf-8') as word:
    d = json.load(word)

超級(jí)簡(jiǎn)單,利用 json 庫(kù)將 keyword.js 文件中的內(nèi)容轉(zhuǎn)化為 Python List 對(duì)象

然后是數(shù)據(jù)組合,代碼已經(jīng)在上面展示了。

最后發(fā)送請(qǐng)求:

add(data) print('處理完成,休息2秒...') time.sleep(2)
  • add 方法是將 Python 請(qǐng)求代碼做了下封裝,便于調(diào)用,其中將動(dòng)態(tài)的部分用,通過(guò)參數(shù) data 替換
  • time.sleep(2) 是一種友好,休息 2 秒鐘,以免驚醒反爬神獸(友情提醒:驚醒反爬機(jī)制一點(diǎn)都不好玩

好了,這樣搞定了,寫代碼用了一個(gè)多小時(shí),跑完不到兩分鐘。

收尾

美中不足的是,代碼只照顧了大多數(shù)的一條消息的回復(fù)(代碼中直接獲取的數(shù)組中第一個(gè)元素, 如 kw['reply_list'][0]),還有幾條回復(fù)是多條消息,照顧不上。

如果要照顧,可能的話 80% 以上的時(shí)間,以兼容 20% 不到的情況,不劃算。

怎么辦?涼拌!—— 直接手動(dòng)添加。

哈哈,我很樂(lè)意做這一點(diǎn)手工活兒。

總結(jié)

類似這樣的方式,用在其他的地方,完全是可以的,比如之前的約馬程序,訓(xùn)練營(yíng)運(yùn)營(yíng)數(shù)據(jù)提取 等等,都是一樣的套路:

  1. 分析瀏覽器的請(qǐng)求,推薦使用 Chrome 瀏覽器
  2. 將請(qǐng)求復(fù)制為 cURL bash 命令
  3. 粘貼到 CURL to Python 中提取 Python 代碼
  4. 修改 Python 代碼,以動(dòng)態(tài)處理數(shù)據(jù)

就這么簡(jiǎn)單,Get 到了嗎?

那,趕緊找個(gè)地方試試吧。

每天進(jìn)步一點(diǎn)點(diǎn),生活更美好,比心!

數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說(shuō)明請(qǐng)參見(jiàn):http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }