Python爬蟲實戰之(六)| 模擬登錄拉勾網

作者:xiaoyu

微信公眾號:Python數據科學

知乎:zhuanlan.zhihu.com/pypc


模擬登錄想必大家已經熟悉了,之前也分享過關於模擬登錄wechat和京東的實戰,鏈接如下:

  • Python爬蟲之模擬登錄wechat
  • Python爬蟲之模擬登錄京東商城

介紹

本篇,博主將分享另一個模擬登錄的實例供大家分享,模擬登錄拉勾網

廢話不多說了,還是老套路使用fiddler或者開發者工具來幫助我們完成模擬登錄的整個過程,通過觀察http的headers請求頭來模擬 post 請求各種參數。當然如何找到這些參數就顯得尤為重要了,一些參數是時間戳,而一些參數是動態加密的。

對於這些參數的獲取,有幾個常用方法:

  • 請求Ajax獲取參數;
  • 查看頁面源碼;
  • 解密參數;

本篇的模擬登錄對象拉鉤網就對登錄密碼就進行了md5雙重加密,因此我們只須雙重加密獲得相應的密碼就可以了。

代碼部分

需要的package

import reimport osimport timeimport jsonimport sysimport subprocessimport requestsimport hashlibfrom bs4 import BeautifulSoup

建立一個類

class Lagou_login(object): def __init__(self): self.session = requests.session() self.CaptchaImagePath = os.path.split(os.path.realpath(__file__))[0] + os.sep + captcha.jpg self.HEADERS = {Referer: https://passport.lagou.com/login/login.html, User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.4882.400 QQBrowser/9.7.13059.400, X-Requested-With: XMLHttpRequest}

  • session: 創建持久對話
  • CaptchaImagePath:驗證碼的path
  • HEADERS:請求頭

登錄密碼加密

def encryptPwd(self, passwd): # 對密碼進行了md5雙重加密 passwd = hashlib.md5(passwd.encode(utf-8)).hexdigest() # veennike 這個值是在js文件找到的一個寫死的值 passwd = veenike+passwd+veenike passwd = hashlib.md5(passwd.encode(utf-8)).hexdigest() return passwd

對用戶密碼進行雙重md5加密。

獲取請求token

def getTokenCode(self): login_page = https://passport.lagou.com/login/login.html data = self.session.get(login_page, headers= self.HEADERS) soup = BeautifulSoup(data.content, "lxml", from_encoding=utf-8) 要從登錄頁面提取token,code, 然後在頭信息裡面添加 <!-- 頁面樣式 --><!-- 動態token,防禦偽造請求,重複提交 --> <script type="text/javascript"> window.X_Anti_Forge_Token = dde4db4a-888e-47ca-8277-0c6da6a8fc19; window.X_Anti_Forge_Code = 61142241; </script> anti_token = {X-Anit-Forge-Token: None, X-Anit-Forge-Code: 0} anti = soup.findAll(script)[1].getText().splitlines() anti = [str(x) for x in anti] anti_token[X-Anit-Forge-Token] = re.findall(r= (.+?), anti[1])[0] anti_token[X-Anit-Forge-Code] = re.findall(r= (.+?), anti[2])[0] return anti_token

這部分可以從headers請求頭參數中看到,並且在頁面源碼中可以直接查找到。

驗證碼處理

def getCaptcha(self): captchaImgUrl = https://passport.lagou.com/vcode/create?from=register&refresh=%s % time.time() # 寫入驗證碼圖片 f = open(self.CaptchaImagePath, wb) f.write(self.session.get(captchaImgUrl, headers=self.HEADERS).content) f.close() # 打開驗證碼圖片 if sys.platform.find(darwin) >= 0: subprocess.call([open, self.CaptchaImagePath]) elif sys.platform.find(linux) >= 0: subprocess.call([xdg-open, self.CaptchaImagePath]) else: os.startfile(self.CaptchaImagePath) # 輸入返回驗證碼 captcha = input("請輸入當前地址(% s)的驗證碼: " % self.CaptchaImagePath) print(你輸入的驗證碼是:% s % captcha) return captcha

  • 此處驗證碼還是通過請求下載到本地然後手動輸入的方法完成
  • 引入subprocess將會自動打開圖片而不用手動點開(對應於3種常用操作系統)

登陸操作

def login(self, user, passwd, captchaData=None, token_code=None): postData = {isValidate: true, password: passwd, # 如需驗證碼,則添加上驗證碼 request_form_verifyCode: (captchaData if captchaData!=None else ), submit: , username: user } login_url = https://passport.lagou.com/login/login.json #頭信息添加token login_headers = self.HEADERS.copy() token_code = self.getTokenCode() if token_code is None else token_code login_headers.update(token_code) # data = {"content":{"rows":[]},"message":"該帳號不存在或密碼錯誤,請重新輸入","state":400} response = self.session.post(login_url, data=postData, headers=login_headers) data = json.loads(response.content.decode(utf-8)) if data[state] == 1: return response.content elif data[state] == 10010: print(data[message]) captchaData = self.getCaptcha() token_code = {X-Anit-Forge-Code : data[submitCode], X-Anit-Forge-Token : data[submitToken]} return self.login(user, passwd, captchaData, token_code) else: print(data[message]) return False

  • 通過請求login_url介面api判斷登錄是否成功
  • 將獲取的和處理的各種參數通過post發出請求
  • 使用json解析返回數據
  • 判斷state參數

主函數

if __name__ == "__main__": username = input("請輸入你的手機號或者郵箱
>>>:") passwd = input("請輸入你的密碼
>>>:") lg = Lagou_login() passwd = lg.encryptPwd(passwd) data = lg.login(username, passwd) if data: print(data) print(登錄成功) else: print(登錄不成功)

登錄結果顯示

相信大家已經get到如何使用模擬登錄了,下面是成功登錄的顯示結果:

鏈接:github.com/xiaoyusmd/La

關注微信公眾號Python數據科學,掌握更多精彩內容,發送「學習資料」獲取python學習電子書籍。


推薦閱讀:

TAG:爬蟲計算機網路 | 拉勾網 | Python |