模拟登录之拉勾网

接上一篇模拟登录之果壳网。果壳网的模拟登录较为简单,表单的结构不复杂,而有些网站会给密码和账号加密、再添加一些额外验证字段后才进行验证,有些难度,这篇用以记录拉勾网模拟登录过程,前期准备和文章模拟登录之果壳网一样,移步{% post_link 模拟登录之果壳网 %}。

思路

  1. 分析表单,找出需要提交的字段
  2. 经过分析,大多数提交字段都可以在 html 源码中找到
  3. 密码经过 md5 加密

分析表单

拉勾网登录 url:https://passport.lagou.com/login/login.html

登录账号:8x6x7x5x2@qq.com
登录密码:123456789

login.png

由于之前实验了多次,所以出现拉钩官网重置密码的提示,可以忽略。

点击登录后的信息:

info.png

重要的有两个,login.jsoncreate?from=register&refresh=1506950234998
先查看login.json

form2.png

提交的方法为 POST ,说明表单提交的目的地就是这个地址,还有需要提交的表单字段:

form1.png

多达 8 项表单字段,红色方框内以 X- 开头的都可以在 html 源码中找到,值得注意的是橙色方框内的 password 字段并不是我们所填的密码 123456789,而是一串很长的且不是由用户输入的字符串,这就是经过加密的密码,经过某种加密算法生成。

再看create?from=register&refresh=1506950234998

capcha.png

这就是验证码的地址,其实在一开始登录界面时并没有要求输入验证码,但是既然在调试器中发现了,并且为了此次模拟登录的成功,就要将它添加到模拟登录的逻辑中。

寻找表单字段

X-Requested-With

在多次试验后,此字段为固定值:X-Requested-With : XMLHttpRequest

X-Anit-Forge-Code 和 X-Anit-Forge-Token

这两个值在 html 源码中找到,可以使用正则表达式筛选出来:

token.png
# 获取 X-Anit-Forge-Code 和 X-Anit-Forge-Token
def get_anti_Code_Token():
    url = 'https://passport.lagou.com/login/login.html'
    response = session.get(url, headers=headers)
    match_obj = re.match(r".*?Forge_Token = '(.*?)'.*Forge_Code = '(.*?)'.*", response.text, re.DOTALL)
    if match_obj:
        code = match_obj.group(2)
        token = match_obj.group(1)
        return code, token
    else:
        'failed to match code and token!'
isValidate

此字段为固定值,isValidate: true

submit

此字段为空

request_form_verifyCode
  1. 验证码,通过访问https://passport.lagou.com/vcode/create?from=register&refresh=当前时间秒数获得,类似上一篇模拟登录之果壳网,获取验证码方法相似:
# 获取验证码,生成当前时间,拼凑好url,将 response 的内容(也就是验证码图片)下载到本地,在通过 PIL 库展示给用户进行输入
def get_captcha():
    url = 'https://passport.lagou.com/vcode/create?from=register&refresh={}'.format(str(int(time.time() * 1000)))
    response = session.get(url, headers=headers)
    with open('captcha.jpg', 'wb') as f:
        f.write(response.content)
        f.close()
    from PIL import Image
    try:
        captcha_image = Image.open('captcha.jpg')
        captcha_image.show()
        captcha_image.close()
    except:
        print 'captcha.jpg not found!'
    code = raw_input('please check the captcha code and enter it:')
    return code
username

直接输入

password

password 经过 md5 加密,在 html 源码中,查看每一个 js 文件,然后找到了拉勾网对密码加密的具体方法:

md5.png

主要分析红色方框两行代码,分为以下几步加密了用户输入的密码:

  1. 定义一个 c 为字符串 "veenike"
  2. md5() 方法加密用户输入的密码,再将此时得到的值用 hexdigest() 方法转成另一个字符串,字面意思大概是转换成一串 16 进制数,暂且将它命名为 first_encrypt
  3. 此时再将 first_encrypt 与 c 相加,公式为 c + first_encrypt + c,此时得到的结果给它命名为 rude
  4. 此时再重复第 2 步md5() 再次编码,hexdigest() 再次编码,就得到最后结果

写成 python 代码:

def encrypt_password(password):
    stable_word = 'veenike'
    first_encrypt = hashlib.md5(password).hexdigest()
    rude = stable_word + first_encrypt + stable_word
    second_encrypt = hashlib.md5(rude).hexdigest()
    print second_encrypt
    return second_encrypt

到这里,所有的表单字段都已经找到,开始写登录主函数。

登录

一些说明:

  • 基本爬虫必备 User-Agent
  • 用到 requests session(),保证连接持续性
  • cookielib 保存模拟登录成功后的 cookies 到本地,之后的登录读取此 cookies,免账号密码登录

登录主函数示例:

def lagou_login(phone_number, password):
    url = 'https://passport.lagou.com/login/login.json'
    post_data = {
        'isValidate': 'true',
        'username': phone_number,
        'password': # 加密方法函数,
        'request_form_verifyCode': # 获取验证码,
        'submit': ''
    }
    code_token = # 获取两个 token 值
    token_headers = # user-agent 模仿浏览器
    token_headers['X-Anit-Forge-Code'] = code_token[0]
    token_headers['X-Anit-Forge-Token'] = code_token[1]
    token_headers['X-Requested-With'] = 'XMLHttpRequest'
    token_headers['Referer'] = 'https://passport.lagou.com/login/login.html' # 在浏览器找到添加
    response = session.post(url, data=post_data, headers=token_headers) # 用 session 保持连续性
    session.cookies.save()  # 保存登录成功后的 cookies
    pass

Referer 也是要提交的表单字段之一,和其他字段一样,在调试器中找到。

等代码运行完后看看保存到本地的 cookies

cookies.png

目测有效期为一个星期左右。

测试 cookies 是否有效

获取到 cookies 后,因为不知道 cookies 是否有效,此时有必要写一个函数来验证它的有效性,拿着这个 cookies 去访问一个需要登录后才能访问的 url,比如个人中心,这些 url 没有登录是不能访问的:

session = requests.session()
session.cookies = cookielib.LWPCookieJar('cookies.txt')
try:
    session.cookies.load(ignore_discard=True) #加载cookies
except:
    print 'cookies failed to load!'
else:
    print 'cookies has been loading!'
    
def is_login(): 
    url = 'https://www.lagou.com/mycenter/invitation.html'
    response = session.get(url, headers=headers)
    if response.status_code != 200:
        return False
    else:
        return True

返回状态码为 200 时,就说明此 cookies 有效。

完整代码地址: github

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269