python模拟人工操作_Python爬虫实战之(六)| 模拟登录拉勾网

作者:xiaoyu

微信公众号:Python数据科学

知乎:python数据分析师

模拟登录想必大家已经熟悉了,之前也分享过关于模拟登录wechat和京东的实战,链接如下:

Python爬虫之模拟登录wechat

Python爬虫之模拟登录京东商城

介绍

本篇,博主将分享另一个模拟登录的实例供大家分享,模拟登录拉勾网。

废话不多说了,还是老套路使用fiddler或者开发者工具来帮助我们完成模拟登录的整个过程,通过观察http的headers请求头来模拟 post 请求各种参数。当然如何找到这些参数就显得尤为重要了,一些参数是时间戳,而一些参数是动态加密的。

对于这些参数的获取,有几个常用方法:

请求Ajax获取参数;

查看页面源码;

解密参数;

本篇的模拟登录对象拉钩网就对登录密码就进行了md5双重加密,因此我们只须双重加密获得相应的密码就可以了。

代码部分

需要的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, 然后在头信息里面添加

window.X_Anti_Forge_Token = 'dde4db4a-888e-47ca-8277-0c6da6a8fc19';

window.X_Anti_Forge_Code = '61142241';

'''

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到如何使用模拟登录了,下面是成功登录的显示结果:

关注微信公众号Python数据科学,获取 120G 人工智能 学习资料。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值