爬取北大bbs论坛——模拟登陆(一)

一、分析页面

首次登录到北大bbs首页,会发现是以游客身份登录的,只能访问部分内容;

主页

页面左侧有登录模块,找个账号登录进去,就能看到个人登录信息以及内部人员能够访问的模块了。

主页-登录成功

  • 我们需要分析点击“登录”按钮,触发什么操作?

登录按钮

点开js,代码如下

function() {
  var t = ($(".have-login"), $(".not-login"));
  t.addClass("logging");
  var e = t.find("input[name=username]"),
    a = t.find("input[name=password]"),
    i = e.val(),
    n = a.val();
  if (0 == i.length) return BDWM.alert({
    text: "请输入用户名",
    callback: function() {
      e.focus()
    }
  }), !1;
  if (0 == n.length) return BDWM.alert({
    text: "请输入密码",
    callback: function() {
      a.focus()
    }
  }), !1;
  var o = CryptoJS.MD5(n + i + n).toString().toLowerCase();
  $.post("ajax/login.php", {
    username: i,
    password: n,
    keepalive: $('input[name="keepalive"]').prop("checked") ? 1 : 0,
    t: o
  }, function(e) {
    if (e.success) location.reload();
    else {
      t.removeClass("logging");
      var a = t.find("input[name=username]"),
        i = t.find("input[name=password]");
      switch (e.error) {
        case 4:
          BDWM.alert("您输入的用户名不存在"), a.val(""), i.val(""), a.focus();
          break;
        case 5:
          BDWM.alert("您输入的密码有误,请重新输入"), i.val(""), i.focus();
          break;
        default:
          BDWM.alert("其他错误发生,错误码" + e.error)
      }
    }
  }, "json").error(function() {
    BDWM.alert("网络错误,请重试")
  })
}

分析找到"ajax/login.php",js请求登录的网址为https://bbs.pku.edu.cn/v2/ajax/login.php,其中post内容为

var o = CryptoJS.MD5(n + i + n).toString().toLowerCase();
$.post("ajax/login.php", {
    username: i,
    password: n,
    keepalive: $('input[name="keepalive"]').prop("checked") ? 1 : 0,
    t: o
}

username: 用户名

password: 密码

keepalive :下次是否自动登录

t :加密

二、Postman模拟登陆请求

使用postman发送登录请求(post),如下图

Postman-模拟

返回结果

POSTMAN-发送请求

cookie

POSTMAN-cookie

最主要的是拿到cookie,拿到cookie后,再访问北大bbs主页,就能够显示内部成员访问内容了。

三、Python代码实现

思路一

一开始想法是post请求,获取cookie并解析保存,然后带上保存的cookie访问访问主页

思路二

直接用session请求登录,返回的cookie直接保存在session中,用session访问主页

代码实现如下

# -*- coding: utf-8 -*-
__author__ = 'iccool'

import hashlib
import requests
from requests import RequestException
import json

headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36'
}

# 用户名
i = 'your username'
# 密码
n = 'your password'
# 结合用户名和密码 md5加密
o = str(hashlib.md5((n+i+n).encode(encoding='UTF-8')).hexdigest()).lower()

# post 请求体
data = {
    'username':i,
    'password':n,
    'keepalive':1,
    't':o,
}

proxy ={
    'http':'your proxy',
    'https':'your proxy'
}

def get_session():
    try:
        # session 请求
        session = requests.session()
        # 设置代理
        # session.proxies = proxy
        # post请求 返回的cookie保存在session中
        post = session.post('https://bbs.pku.edu.cn/v2/ajax/login.php', data=data, headers=headers)
        # 判断返回状态 
        if post.status_code == 200:
            # 解析 登录是否成功
            status = json.loads(post.text)['success']
            # 登录成功 返回session
            if status is True:
                return session
            else:
                print('请核实用户名和密码!')
                return None
        else:
            print('请求失败')
            return None
    except RequestException:
        print('请求失败')

def main():
    # 获取 登录session
    session = get_session()

    if session is not None:
        # session 请求主页 登录cookie已保存在session中
        response = session.get('https://bbs.pku.edu.cn/v2/home.php', headers=headers)
        # 拿到返回数据  下一步就是解析页面内容
        print(response.text)

if __name__ == '__main__':
    main()

response.text内容如下 (只截取用户部分)

登录成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值