入門爬蟲一段時間,最近在做一個拉勾網的資料爬蟲分析,項目也快接近尾聲了,於是抽個時間寫一下這個項目中遇到的一些問題。
目前拉勾網的反爬蟲機制還是可以的,一開始用scrapy shell 分析拉勾網,發現拉勾網要校正useragent,然後訪問不到幾次就會被重新導向到登入頁面,即拉勾網會校正cookie。
下面是類比登陸的思路:
拉勾網登入頁面: https://passport.lagou.com/login/login.html
抓包分析一下
可以分析出類比登陸需要的參數:
url = “https://passport.lagou.com/login/login.html”
postData = {
‘isValidate’ : ‘true’,
‘username’ : username,
‘password’: password,
‘request_form_verifyCode’: ”,
‘submit’: ”
}
HEADERS = {
‘Referer’: ‘https://passport.lagou.com/login/login.html‘,
‘User-Agent’: ”,
‘X-Requested-With’: ‘XMLHttpRequest’,
‘X-Anit-Forge-Token’: ”,
‘X-Anit-Forge-Code’, ”,
}
那麼如何去擷取X-Anit-Forge-Token、X-Anit-Forge-Code這兩個參數呢。
我們開啟F12認真看登入頁面的原始碼
可以在head標籤裡面可以找到這兩個值,只需要用正則去匹配出來就可以了。
那麼登入的密碼是怎麼加密的呢。
從源碼裡可以看出,登入頁面 載入的js並不多,那麼就一個一個找吧。
在 main.html_aio_f95e644.js (“https://img.lagou.com/passport/static/pkg/pc/page/login/main.html_aio_f95e644.js“)
這個js裡面發現了加密的方法:
首先對密碼進行一次md5加密:password = md5(password)
然後前後加上veenike這串字元: password = “veenike” + password + “veenike”
最後再次進行md5加密:password = md5(password)
那麼到這裡分析就差不多了,下面為類比登入的代碼
#!/usr/bin/env python# -*- coding:utf-8 -*-import requestsimport hashlibimport re#請求對象session = requests.session()#要求標頭資訊HEADERS = { 'Referer': 'https://passport.lagou.com/login/login.html', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:51.0) Gecko/20100101 Firefox/51.0',}def get_password(passwd): '''這裡對密碼進行了md5雙重加密 veennike 這個值是在main.html_aio_f95e644.js檔案找到的 ''' passwd = hashlib.md5(passwd.encode('utf-8')).hexdigest() passwd = 'veenike' + passwd + 'veenike' passwd = hashlib.md5(passwd.encode('utf-8')).hexdigest() return passwddef get_token(): Forge_Token = "" Forge_Code = "" login_page = 'https://passport.lagou.com/login/login.html' data = session.get(login_page, headers=HEADERS) match_obj = re.match(r'.*X_Anti_Forge_Token = \'(.*?)\';.*X_Anti_Forge_Code = \'(\d+?)\'', data.text, re.DOTALL) if match_obj: Forge_Token = match_obj.group(1) Forge_Code = match_obj.group(2) return Forge_Token, Forge_Codedef login(username, passwd): X_Anti_Forge_Token, X_Anti_Forge_Code = get_token() login_headers = HEADERS.copy() login_headers.update({'X-Requested-With': 'XMLHttpRequest', 'X-Anit-Forge-Token': X_Anti_Forge_Token, 'X-Anit-Forge-Code': X_Anti_Forge_Code}) postData = { 'isValidate': 'true', 'username': username, 'password': get_password(passwd), 'request_form_verifyCode': '', 'submit': '', } response = session.post('https://passport.lagou.com/login/login.json', data=postData, headers=login_headers) print(response.text)def get_cookies(): return requests.utils.dict_from_cookiejar(session.cookies)if __name__ == "__main__": username = '1371XXXXXXX' passwd = 'xxxxxxxxxx' login(username, passwd) print(get_cookies())
控制台結果
類比登入以後便能擷取到cookie,為爬蟲做準備。代碼拷貝就即能跑,不過拉勾網的登入校正隨時會改變,若發現登入失敗的可以在下面評論,我會抽空更新代碼。
github地址:https://github.com/laichilueng/lagou_login
喜歡的可以去點個贊,謝謝