Python爬蟲實戰之(六)| 模擬登錄拉勾網
作者:xiaoyu
微信公眾號:Python數據科學
知乎:https://zhuanlan.zhihu.com/pypcfx
模擬登錄想必大家已經熟悉了,之前也分享過關於模擬登錄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到如何使用模擬登錄了,下面是成功登錄的顯示結果:
鏈接:https://github.com/xiaoyusmd/Lagou_login
關注微信公眾號Python數據科學,掌握更多精彩內容,發送「學習資料」獲取python學習電子書籍。
推薦閱讀: