爬蟲帶你逛知乎(下篇)

接上篇爬蟲帶你逛知乎(上篇)

我們需要做的是:

  1. 下載照片
  2. 判斷是否符合帶逛規則

  3. 點贊

下載照片

直接上代碼把

接收一個列表,然後遍歷列表,再用requests下載,圖片存儲再images目錄下

#下載圖片 def downloadimage(urllist): for url in urllist: ir = s.get(url,headers=HEADERS) if ir.status_code == 200: open(images%s %(url.split(r/)[-1]), wb).write(ir.content)

判斷是否符合帶逛規則

這個採用的是微軟小冰測顏值介面

我們先點擊上傳照片,發現有兩個請求

請求1,

kan.msxiaobing.com/Api/ post一個請求

發送的參數就是圖片的base64格式

返回值是 圖片在微軟的地址(下面會用到)

請求2

kan.msxiaobing.com/Api/ post一個請求

查詢參數有兩個:

service:yanzhitid:d9302b5b916f413482683aa7a4188905

service是固定的(因為我們測的是顏值)

tid應該是一個驗證參數(到時候去網頁源代碼找)

發送的參數有三個:

MsgId:1486513023436CreateTime:1486513023Content[imageUrl]:https://mediaplatform.msxiaobing.com/image/fetchimage?key=JMGkEUAgbwTVisRZ31qsgvGGkHchYrclVQED5dpuou5ktazcMYiXmN06Rj8

經過驗證 MsgId & CreateTime都是時間戳

Content[imageUrl] 則是我們請求1或者的返回值

返回值

text:"妹子竟有8.8分顏值,美得無法直視,多少直男競折腰,腰,腰"

可以看到已經有分數了,只要用正則匹配下就行

最後(獲取tid)

把tid複製,然後查看網頁源代碼,發現tid已經找到了。

代碼如下:

class checkyanzhi(): def __init__(self,imagebase64): self.ss = requests.session() # 上傳圖片地址 self.uploadurl = https://kan.msxiaobing.com/Api/Image/UploadBase64 # 首頁地址(獲取tid的地址) self.yanzhiurl = https://kan.msxiaobing.com/ImageGame/Portal?task=yanzhi # 得到分數的地址 self.processurl = https://kan.msxiaobing.com/Api/ImageAnalyze/Process # 圖片的base64 self.imagebase64 = imagebase64 def upload(self): z = ss.post(self.uploadurl,self.imagebase64) ret = z.json() """ 返回值 {uHost: uhttps://mediaplatform.msxiaobing.com, uUrl: u/image/fetchimage?key=JMGqEUAgbwDVieSjh8AgKUq4khZmjMOAaWgzt4SRHupVmtMhpXE1ZRFbaX8} """ return %s%s%(ret[Host],ret[Url]) def process(self): z1 = self.ss.get(self.yanzhiurl) #獲取tid tid = etree.HTML(z1.content).xpath(//input[@name="tid"]/@value)[0] tm = time.time() data = {MsgId:%s %int(tm*1000),CreateTime:%s %int(tm), Content[imageUrl]:self.upload()} z2 = self.ss.post(url=self.processurl,params={"service":"yanzhi", "tid":tid},data=data) """ 返回值 { "msgId": "1486513023436", "timestamp": 0, "receiverId": null, "content": { "text": "妹子竟有8.8分顏值,美得無法直視,多少直男競折腰,腰,腰", "imageUrl": "http://mediaplatform.trafficmanager.cn/image/fetchimage?key=UQAfAC8ABAAAAFcAFgAGABYASgBGADgANQA4ADcANQBCAEQANwAzADQANwA0AEQAMAAzADAAQQBGADQAMgA3ADIAQwBFADYAMgAxAEUAMABFADIA", "metadata": { "AnswerFeed": "FaceBeautyRanking", "w": "vc_YiuTzgvP2h_PAW0tgjOnpoMH5vendgPXvgubnhNHehfL4j9L6rvjRsM7ngPXvgPzzhN_YhP7sjvXYrsj7vuP5h8zTiuTlier5jNnUgeTf", "aid": "AFC44578B499147016D1C68CDC73F993" } } } """ ret = z2.json()[content][text] mark = re.findall(r"d+.?d?",ret) return mark[0]

點贊

當我贊一下的時候,可以看到有

kan.msxiaobing.com/Api/ post一個請求

參數為answer_id,之前我們就已經獲取到了

method:vote_upparams:{"answer_id":"53574540"}

代碼如下

def vote_up(answer_id): url = https://www.zhihu.com/node/AnswerVoteBarV2 data = {method:vote_up, params:{"answer_id":"%s"}% answer_id} # 獲取xsrf _xsrf = getxsrf() # 把_xsrf添加到瀏覽器頭 HEADERS[X-Xsrftoken] = _xsrf z2 = s.post(url,data=data,headers=HEADERS) if z2.status_code == 200: #如果msg不為空,表示點贊出錯. if z2.json()[msg] != None: print z2.json()[msg] else: print u%s點贊ok % answer_id

總結

本次爬蟲,我們一共抓取了以下介面

  1. 話題列表(關注的所有話題)
  2. 每個話題的最新動態
  3. 微軟小冰測顏值
  4. 點贊

最後所有的代碼都已經上傳到github上 kimg1234/pachong

需要注意的是:

我使用的是django modle存儲的(資料庫為postgres)

lundaig.py 的運行邏輯是:

  1. 抓取當前用戶關注的所有話題
  2. 獲取話題的最新動態
  3. 把圖片丟給微軟小冰驗證,並返回分數

upupup.py 只是點贊

最後 帶逛的結果在 車輪滾滾 - 知乎

歡迎關注本人的微信公眾號獲取更多Python爬蟲相關的內容

(可以直接搜索「Python爬蟲分享」)

推薦閱讀:

10min手寫(一):伺服器內存監控系統
為什麼 x in range(1000000000000001) 的執行速度這麼快
如何看待將Python代碼轉換成Go代碼並進一步編譯的 Grumpy 項目?
基於ArcGIS的python編程:2.python基礎(一)

TAG:Python | 爬虫计算机网络 |