爬蟲帶你逛知乎(下篇)
接上篇爬蟲帶你逛知乎(上篇)
我們需要做的是:
- 下載照片
- 判斷是否符合帶逛規則
- 點贊
下載照片
直接上代碼把
接收一個列表,然後遍歷列表,再用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,
向http://kan.msxiaobing.com/Api/Image/UploadBase64 post一個請求
發送的參數就是圖片的base64格式
返回值是 圖片在微軟的地址(下面會用到)
請求2
向http://kan.msxiaobing.com/Api/ImageAnalyze/Process 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]
點贊
當我贊一下的時候,可以看到有
向http://kan.msxiaobing.com/Api/ImageAnalyze/Process 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
總結
本次爬蟲,我們一共抓取了以下介面
- 話題列表(關注的所有話題)
- 每個話題的最新動態
- 微軟小冰測顏值
- 點贊
最後所有的代碼都已經上傳到github上 kimg1234/pachong
需要注意的是:
我使用的是django modle存儲的(資料庫為postgres)
lundaig.py 的運行邏輯是:
- 抓取當前用戶關注的所有話題
- 獲取話題的最新動態
- 把圖片丟給微軟小冰驗證,並返回分數
upupup.py 只是點贊
最後 帶逛的結果在 車輪滾滾 - 知乎
歡迎關注本人的微信公眾號獲取更多Python爬蟲相關的內容
(可以直接搜索「Python爬蟲分享」)
推薦閱讀:
※10min手寫(一):伺服器內存監控系統
※為什麼 x in range(1000000000000001) 的執行速度這麼快
※如何看待將Python代碼轉換成Go代碼並進一步編譯的 Grumpy 項目?
※基於ArcGIS的python編程:2.python基礎(一)