最近看知乎的帖子太累了,所有想直接用爬蟲爬取以后存入數(shù)據(jù)庫再看棘脐。
廢話不多說直接行動吧
點擊www.zhihu.com發(fā)現(xiàn)會直接跳轉到登入頁面
也就是沒有登入的情況系知乎是不允許我們?yōu)g覽主頁的內容的
那我們先去看看登入頁面有什么必須要填的選項吧
打開chrome瀏覽器的調試模式
然后我們故意輸入一個錯誤的賬號和密碼雀久,看看會發(fā)送一些什么請求
看到飄紅的sign_in以后發(fā)現(xiàn)賬號和密碼是需要發(fā)送給他的
打開地址看看
需要發(fā)送的地址是https://www.zhihu.com/api/v3/oauth/sign_in,是以post的方式發(fā)送的
我看看他發(fā)送的內容是什么
果然又是加密的數(shù)據(jù)
既然這樣我們就在chrome里面查找一下,看看他到底請求了多少數(shù)據(jù)吧
打開全局搜索
看看sign_in到底在哪里
找到了數(shù)據(jù)剂桥,我們打個斷點看看,需要發(fā)送的數(shù)據(jù)有哪些
開始嘗試發(fā)送數(shù)據(jù)百姓,然后打上斷點
現(xiàn)在我們知道他需要的數(shù)據(jù)有哪些了
這里是login_data的內容
captcha:?這個是驗證碼
clientId:?"c3cef7c66a1843f8b3a9e6a1e3160e20"渊额,這個是唯一id號
grantType:?"password",這個是登入類型垒拢,如果是賬戶密碼輸入的就是這個
lang:?"en"旬迹,這個是驗證碼類型,是英文的驗證碼還是中文驗證碼
password:?"12345678"求类,這個是密碼
refSource:?"other_https://www.zhihu.com/signin?next=%2F"奔垦,這個是將要跳轉到哪個頁面
signature:?"ea67db2a6063ea6482d27368aab27a363e276a18",這個是一個加密字符串
source:?"com.zhihu.web"尸疆,這個是服務器地址
timestamp:?1591009623259椿猎,這個是時間戳
username:?"+86123456789"惶岭,這個是手機號碼
utmSource:?undefined,這個暫時不知道
我們全局搜索下犯眠,看看他用的什么加密方式
是通過 Hmac 算法,然后對clientId按灶,grantType,timestamp筐咧,source這四個進行加密
那我們就來寫代碼來模擬這個加密過程
這個是瀏覽器加密出來的鸯旁,我們模擬下加密看看是不是數(shù)據(jù)一樣
signature:?"ea67db2a6063ea6482d27368aab27a363e276a18",這個是一個加密字符串
看來是一致的量蕊,證明加密方式?jīng)]有錯铺罢。
然后我們需要模擬發(fā)送驗證碼請求
https://www.zhihu.com/api/v3/oauth/captcha?lang=en
然后我們把驗證碼數(shù)據(jù)通過post方式提交到
https://www.zhihu.com/api/v3/oauth/captcha?lang=en里面
然后我們需要把驗證碼以及賬號密碼更新到login_data里面
再把時間戳,請求的驗證碼残炮,以及加密以后的signature也更新到login_data
然后我們需要在請求頭里面攜帶上x-xsrftoken的參數(shù)
headers.update({
'content-type':'application/x-www-form-urlencoded',
? ? 'x-zse-83':'3_2.0',
? ? 'x-xsrftoken':self._get_xsrf()
})
這個參數(shù)是在我們訪問頁面的時候自動會寫入到headers里面的韭赘,我們只要提取出來就好了
然后我們需要把數(shù)據(jù)集合起來然后發(fā)送到
https://www.zhihu.com/api/v3/oauth/sign_in里面進行登入認證
我們先看看瀏覽器上面攜帶了哪些信息
瀏覽器上加密了
我們要找到他加密的方式
我們搜索_encrypt發(fā)現(xiàn)了他是用這個加密的,我們把這段JavaScript復制下來放入到js
我們是用的是node環(huán)境來運行js
但是在node環(huán)境里面是沒有atob這個函數(shù)的势就,所以我們使用Buffer.from來進行
然后我們使用execjs這個包把需要加密的參數(shù)放入到里面去
然后執(zhí)行就可以得到加密的參數(shù)了
然后我們使用scrapy這個框架來進行發(fā)送POST數(shù)據(jù)
然后測試一下
我們測試一下知乎的熱榜這個欄目
這個欄目我們在沒有登入的情況下泉瞻,輸入看看
可以看到知乎是不讓我們訪問的,必須登入
那我們利用爬蟲模擬用戶登入后再去訪問試試
賬戶密碼我已經(jīng)填寫好啦蛋勺,肯定不會讓你們看到的瓦灶。,我們先填寫一下驗證碼
我們看看html給我們返回的數(shù)據(jù)
再看看網(wǎng)頁里面的數(shù)據(jù)
我們成功的獲取到了知乎的熱點內容抱完,接下來我們只要訪問這些頁面贼陶,把所有用戶的回答全部保存到我們的數(shù)據(jù)庫就可以了
至于寫入數(shù)據(jù)庫這個,因為我沒什么需要爬取的知乎數(shù)據(jù)所以我就不寫入到數(shù)據(jù)庫了巧娱。
具體的源碼的話碉怔,如果有需要我會分享的。