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

做者:xiaoyujavascript

微信公衆號:Python數據科學html

知乎:python數據分析師java


模擬登陸想必你們已經熟悉了,以前也分享過關於模擬登陸wechat和京東的實戰,連接以下:python

介紹

本篇,博主將分享另外一個模擬登陸的實例供你們分享,模擬登陸拉勾網github

廢話很少說了,仍是老套路使用fiddler或者開發者工具來幫助咱們完成模擬登陸的整個過程,經過觀察http的headers請求頭來模擬 post 請求各類參數。固然如何找到這些參數就顯得尤其重要了,一些參數是時間戳,而一些參數是動態加密的。json

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

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

本篇的模擬登陸對象拉鉤網就對登陸密碼就進行了md5雙重加密,所以咱們只須雙重加密得到相應的密碼就能夠了。bash

代碼部分

須要的package

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'}
複製代碼
  • 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("請輸入你的手機號或者郵箱\n >>>:")
    passwd = input("請輸入你的密碼\n >>>:")

    lg = Lagou_login()
    passwd = lg.encryptPwd(passwd)

    data = lg.login(username, passwd)
    if data:
        print(data)
        print('登陸成功')
    else:
        print('登陸不成功')
複製代碼

登陸結果顯示

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

連接:github.com/xiaoyusmd/L…


關注微信公衆號`Python數據科學`,帶你走進數據的世界。 ![](https://user-gold-cdn.xitu.io/2018/5/2/1631e76f69dda0ed?w=344&h=344&f=jpeg&s=8754)
相關文章
相關標籤/搜索