1. 程式人生 > 實用技巧 >Python爬蟲教程:利用Python爬蟲實現CSDN模擬登入

Python爬蟲教程:利用Python爬蟲實現CSDN模擬登入

大綱

  • 前言
  • 分析加密引數
  • uaTokenwebUmidToken
  • 傳送模擬請求
  • 對比解決障礙
  • 瀏覽器傳送postman模仿
  • 小結
  • 編寫程式碼
  • pythonjava

很多人學習python,不知道從何學起。
很多人學習python,掌握了基本語法過後,不知道在哪裡尋找案例上手。
很多已經做案例的人,卻不知道如何去學習更加高深的知識。
那麼針對這三類人,我給大家提供一個好的學習平臺,免費領取視訊教程,電子書籍,以及課程的原始碼!??¤
QQ群:623406465

前言

  • 很久以前研究過csdn的模擬登入,記得那個時候的csdn登入還是一個`form``表單,然後參雜著一些引數。使用遍歷input元素把表單各個引數拿下來。存下直接post即可登陸成功。
  • 前幾天再次看了下親愛的csdn。突然發現多了這連個引數。這就勾起了我的性趣和好奇心:我靠,就一年沒見,csdn也搞這麼一大串加密?並且以看兩種加密方式還不一樣哇?有點東西!
  • 下面就分享一下分析的過程!由於時間有限,只能每晚抽點時間研究,如果大家感覺不夠深入或者講的不好請諒解!大家也可以看另一篇破解的文章
    爬蟲之網易雲js解密剖析

使用工具:

  • 谷歌瀏覽器
  • postman傳送請求除錯
  • fidder抓包

分析加密引數

可以根據上圖分析得知:有uaToken 和webUmidToken兩個token。
分析引數肯定是要打斷點的,一般有直接搜尋,檢視js呼叫堆疊,和hook查詢找到引數位置。我是利用搜索找引數。
分析前先做好一些預備工作,多發幾個請求,重新整理頁面。你會發現:

  1. 不重新整理頁面的話uaToken不會變化。
  2. webUmidToken每次都不一樣。
  3. 每次cookie不變。

uaToken

  • 查詢uaToken發現這段程式碼比較詭異。打斷點debug。發現沒錯,這就是我們要找的!點選F11,進入子函式檢視發生了什麼。
  • 進去發現它執行e()函式。再次F11檢視。
  • 通過校驗發現e函式其實就是一個加密函式,關鍵是它跟我們的核心資料(賬號、cookie、密碼等)無關,所以這個加密資料空有其架勢無作用。你可以儲存一個直接一直使用一個(如果可逆後臺可能會根據字串進行校驗是否符合規則)。

webUmidToken

每次重新整理都會發現他在變化,鑑於前面的token都沒啥作用,我大膽猜測,他也不影響登入!就先不debug分析了。


傳送模擬請求

  • 通過瀏覽器的頭髮送請求資訊。你會發現:不管你怎麼模擬都是各種錯誤,要麼型別錯誤,要麼繁忙,要麼型別錯誤。(可以看得出csdn是java後臺,個人感覺介面異常處理的還有問題。暴露方法了)

對比解決障礙

有時候瀏覽器太過於侷限。用fidder找到其中不同之處。用瀏覽器和postman傳送請求找到其中引數的不同之處。

瀏覽器傳送

postman模仿

  • 你可以發現其中主要是格式區別,和部分頭資訊瀏覽器不顯示需要加上。然後傳送請求檢驗!

小結

  1. 後來發現其實那兩個token,和cookie為空都沒有關係!(可能掃碼登入驗證的token,有興趣可以自行分析)
  2. cookie也沒有限制,在登入時候根本不要cookie都可以。按理論來說應該進入頁面返回一組cookie,用這個cookie訪問登入介面有效才行,顯然csdn沒有。
  3. 分析一波約等於白分析,登入機制太簡單了。
  4. content-length別亂加,加錯了它後臺校驗或出錯
  5. 也就是登入著需要type,賬號密碼即可,其他設為空都行。要注意的就是引數傳送的格式!raw文字。
  6. 以後見到類似先測試登入,不能盲目分析。雖然能夠增加經驗,但是有點浪費時間。。像csdn這次就是。。啥都沒用。

編寫程式碼

思路:訪問登入介面,用返回的cookie訪問我關注的人的文章!

python

import requests
from bs4 import BeautifulSoup

url='https://passport.csdn.net/v1/register/pc/login/doLogin'
header={'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
 'referer':'https://passport.csdn.net/login',
 'origin':'https://passport.csdn.net',
 'content-Type':'application/json;charset=UTF-8',
 'x-requested-with':'XMLHttpRequest',
 'accept':'application/json, text/plain, */*',
 'accept-encoding':'gzip, deflate, br',
 'accept-language':'zh-CN,zh;q=0.9',
 'connection': 'keep-alive'
 ,'Host': 'passport.csdn.net'
 }
data='{"loginType":"1","pwdOrVerifyCode":"你的密碼",' \
 '"userIdentification":"你的賬號","uaToken":"",' \
 '"webUmidToken":""}'
req=requests.post(url,data=data,headers=header)
cookies = requests.utils.dict_from_cookiejar(req.cookies)
res=req.text
print(res)
print(req.status_code)
print(cookies)

url2='https://blog.csdn.net/nav/watchers'
req2=requests.get(url2,cookies=cookies)
soup=BeautifulSoup(req2.text,'lxml')

print(soup.text)

java

依賴jsoup、fastjson

package csdn;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;


import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import com.alibaba.fastjson.JSONObject;

import org.jsoup.Connection.Response;

public class csdn {

    static Map<String, String> cookies;
    

    private static void dologin(String username, String password) throws IOException {

        String url = "https://passport.csdn.net/v1/register/pc/login/doLogin";

        Map<String, String> data = new HashMap<String, String>();
        data.put("loginType", "1");
        data.put("pwdOrVerifyCode", password);
        data.put("userIdentification", username);
        data.put("loginType", "1");
        data.put("uaToken", "");
        data.put("webUmidToken", "");
        String dataString = JSONObject.toJSONString(data);
        JSONObject JSON = JSONObject.parseObject(dataString);
        Connection con = Jsoup.connect(url).header("user-agent",
                "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36")
                .header("referer", "https://passport.csdn.net/login").header("origin", "https://passport.csdn.net")
                .header("content-Type", "application/json;charset=UTF-8").header("x-requested-with", "XMLHttpRequest")
                .header("accept", "application/json, text/plain, */*").header("accept-encoding", "gzip, deflate, br")
                .header("accept-language", "zh-CN,zh;q=0.9").header("connection", "keep-alive")
                .header("Host", "passport.csdn.net").header("Cookie", "").requestBody(JSON.toJSONString())
                .ignoreContentType(true)// 非常重要
                .maxBodySize(1000).method(Connection.Method.POST);

        System.out.println(JSON.toJSONString());
        Response response = con.execute();
        cookies = response.cookies();
        System.out.println(response.body());
    }
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        System.out.println("輸入賬號:");
        String username = sc.next();
        System.out.println("輸入密碼:");
        String password = sc.next();
        dologin(username, password);
    
    }
}


如有錯誤請指教!