關於python模擬登錄知乎驗證碼的問題?
題主真的不是伸手黨TAT,題主真的寫了很久了。只是實在解決不了了
是這樣的。題主寫了一個模擬登錄知乎的小程序。用手機號碼登錄。登錄的時候需要輸入驗證碼。
一開始題主以為urllib.request.urlopen()返回的http包中的html裡邊可以拿到生成的驗證碼的鏈接。但是這個img標籤裡邊沒有src。
所以題主又希望通過再次訪問"http://www.zhihu.com/captcha.gif"來下載驗證碼,再手打進去。但是這樣拿到的驗證碼是登錄不了的,會提示驗證碼錯誤。
檢查發現,在知乎中點擊更換驗證碼,發送的request請求里,"http://www.zhihu.com/captcha.gif"是帶參數的。
所以答主想問的是有沒有能夠直接解析第一次發送登錄請求時,得到的http數據包中驗證碼圖片的辦法。或者有沒有第二次發送請求(也就是更換驗證碼)之後,拿到能用的驗證碼的方法。
不知道描述清楚了沒呢。。很麻煩人,真的很不好意思
謝謝謝謝
源碼如下:
import urllib
import re
import os
import urllib.request
import urllib.parse
import http.cookiejardef getOpener(head):
#創建cookies實例
cj = http.cookiejar.CookieJar()
pro = urllib.request.HTTPCookieProcessor(cj)
#創建一個opener
opener = urllib.request.build_opener(pro)
header = []
for key, value in head.items():
elem = (key, value)
header.append(elem)
opener.addheaders = header
return opener
#getOpener 函數接收一個 head 參數, 這個參數是一個字典. 函數把字典轉換成元組集合, 放進 opener. 這樣我們建立的這個 opener 就有兩大功能:
#自動處理使用 opener 過程中遇到的 Cookies
#自動在發出的 GET 或者 POST 請求中加上自定義的 Headerdef getXSRF(data):
cer = re.compile("name="_xsrf" value="(.*)"", flags = 0)
strlist = cer.findall(data)
return strlist[0]#獲取驗證碼
def getCoptcha(url):
data = opener.open(url)
with open("F:\captcha.gif","wb") as f:
f.write(data.read())if __name__== "__main__":
#構造請求報頭
header ={
"Connection": "Keep-Alive",
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3",
"User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko"
}#訪問首頁來獲取cookies和xsrf
index_url = "http://www.zhihu.com"
opener = getOpener(header)
op = opener.open(index_url)
datatext = op.read().decode()
_xsrf = getXSRF(datatext)#獲取驗證碼
getCoptcha("http://www.zhihu.com/captcha.gif")
cap = input("Please input the captcha:
")
print("the captcha is", cap)#這裡是登錄部分,通過攜帶首頁首次返回的cookies進行登錄請求
url = "https://www.zhihu.com/login/phone_num"
values = {
"_xsrf":_xsrf,
"password":"。。。這裡隱藏了O(∩_∩)O。。。",
"captcha":cap,
"remember_me":"true",
"phone_num":。。。這裡隱藏了O(∩_∩)O。。。}
data = urllib.parse.urlencode(values).encode(encoding="UTF8")
#注意這裡哈!!!!!都特么是血與淚的教訓。 登錄數據要格式化一次。。再編碼一次
op = opener.open(url,data)
print(type(op))
print(op.read().decode("utf-8"))
謝邀。
知乎獲取驗證碼的請求最近做了修改,需要傳兩個參數:
1. `r`: 隨機數,可以用 random 模塊生成,或用當前時間戳
2. `type`: 登錄時固定為 "login"
所以目前(2016-05-16)該鏈接的形式如下:
https://www.zhihu.com/captcha.gif?r=1463377588type=login
知乎驗證碼的操作都隱藏在js代碼中,驗證碼的圖片是在js代碼修改&的src屬性時載入的,其中的參數r是帶毫秒的時間戳。你可以了解一下模擬瀏覽器操作的python庫像selenium,有些網站的反爬蟲系統必須通過模擬瀏覽器操作才能繞過去。
單純為了解決登陸知乎驗證碼的問題的話可以在登陸時用第三方比如微博登錄。這樣就沒有驗證碼的問題了。。(我是用selenium模擬通過微博登陸來爬的)(雖然不知道這樣答是不是不太合題意。。。)
題主怎麼解決的,我爬一個別的網站也總是遇到驗證碼不對,它也是根據時間來生成驗證碼的。我試了下一共才七十多個驗證碼,我全部循環一遍也不行
請問你解決了嗎?我看了你的代碼,還有其讓人的。最後_xsrf和驗證碼都能獲取到,post後得到的響應總是驗證碼會話失效。如下
{"errcode": 1991829, "msg": "驗證碼會話無效 :(", "r": 1, "data": {"name": "ERR_VERIFY_CAPTCHA_SESSION_INVALID", "captcha": "驗證碼會話無效 :("}},模擬登錄不成功,這是怎麼回事呢
我也遇到這個問題了。。。
現在貌似都不可以了.加入時間戳獲取的驗證碼也是登錄不上去.題主你最後成功了么
ps
好像是之前登錄太多次的原因。現在可以了。
推薦閱讀:
※如何爬取摩拜單車位置信息?
※爬蟲怎麼解決封IP的問題?
※爬蟲用哪個好?
※python 中文url 編碼如何轉換回中文?
※爬蟲工程師的未來方向在哪?