做者:xiaoyu
微信公衆號:Python數據科學
知乎:python數據分析師javascript
模擬登陸想必你們已經熟悉了,以前也分享過關於模擬登陸wechat和京東的實戰,連接以下:
Python爬蟲之模擬登陸wechat
Python爬蟲之模擬登陸京東商城html
本篇,博主將分享另外一個模擬登陸的實例供你們分享,模擬登陸拉勾網。java
廢話很少說了,仍是老套路使用fiddler
或者開發者工具
來幫助咱們完成模擬登陸的整個過程,經過觀察http的headers請求頭
來模擬 post 請求各類參數。固然如何找到這些參數就顯得尤其重要了,一些參數是時間戳,而一些參數是動態加密的。python
對於這些參數的獲取,有幾個經常使用方法:linux
Ajax
獲取參數;本篇的模擬登陸對象拉鉤網就對登陸密碼就進行了md5
雙重加密,所以咱們只須雙重加密得到相應的密碼就能夠了。git
import re import os import time import json import sys import subprocess import requests import hashlib from 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'}
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
加密。github
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
請求頭參數中看到,而且在頁面源碼中能夠直接查找到。json
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("請輸入你的手機號或者郵箱\n >>>:") passwd = input("請輸入你的密碼\n >>>:") lg = Lagou_login() passwd = lg.encryptPwd(passwd) data = lg.login(username, passwd) if data: print(data) print('登陸成功') else: print('登陸不成功')
相信你們已經get到如何使用模擬登陸了,下面是成功登陸的顯示結果:api
連接:https://github.com/xiaoyusmd/Lagou_login微信
關注微信公衆號Python數據科學,獲取 120G
人工智能 學習資料。