Python实现北邮人论坛模拟登录

模拟登录北邮人论坛可能是每个学着写爬虫的北邮人必备技能了。在网上和论坛上也有相关资料,但质量参差不齐,有些甚至不能实现模拟登录。因此,这里我使用requests库和urllib2库两种方法,分别实现了北邮人论坛的模拟登录。

教程所需环境:

  • Python 2.x
  • requests 库
laptop.jpg

requests库模拟登录北邮人论坛

教程的刚开始我们先优先使用最为方便的库:requests。

requests库的宣言是:

HTTP for Humans (给人用的 HTTP 库)

通过使用可以看出,requests库确实是当前Python处理网络请求最好用的库!强力推荐大家放弃urllib2库!

安装方式很简单:

1
pip install requests

安装完成之后,可以用下面的代码测试是否安装成功:

1
import requests

如果Python环境没有报错就说明安装成功,可以使用这个最方便的网络请求库了~

下面我们开始分析模拟登录的逻辑。

首先,打开论坛首页https://bbs.byr.cn/#!default,并且退出登录。

然后,按F12键审查元素,并且切换到Network选项卡,并且勾选上preserve log选项。现在的状态如下:

初始状态

重点来了,输入用户名密码后点击登录,你应该能看到下面的信息:

登录状态

可以看出向https://bbs.byr.cn/user/ajax_login.json发送了一个post请求,发送了正确的用户名密码之后,就能登录成功。

另外,经过测试得到,如果请求的头部不正确,论坛会拒绝登录,正确的方式是添加头部。必须添加下面的头部。

1
'x-requested-with': 'XMLHttpRequest'

下面是完整的登录代码,请输入自己的用户名和密码。

1
2
3
4
5
6
7
8
import requests
r_url = 'https://bbs.byr.cn/user/ajax_login.json'
my_header = {'x-requested-with': 'XMLHttpRequest'}
byr_data = {'id': 'fuxuemingzhu', 'passwd': '********'}
session = requests.Session()
req = session.post(r_url, data=byr_data, headers=my_header)
print(req.text)

运行结果,这说明运行代码执行成功:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"id": "fuxuemingzhu",
"user_name": "意涵团·负雪明烛 http://fuxuemingzhu.me",
"face_url": "https://static.byr.cn/uploadFace/F/fuxuemingzhu.120.jpg",
"face_width": 120,
"face_height": 120,
"gender": "m",
"astro": "未知",
"life": 365,
"qq": "",
"msn": "",
"home_page": "http://fuxuemingzhu.me/",
"level": "版主",
"is_online": true,
......
"ajax_code": "0005",
"ajax_msg": "操作成功"
}

这里有必要讲一下为什么使用了Session()的方式,这样可以使用时requests库能自动保存cookies到Session中,也就是说只要程序没关闭,就可以访问其他数据!

比如,我们查一下超神的信息:

1
2
quer = session.get("https://bbs.byr.cn/user/query/zc199102.json", headers=my_header)
print(quer.text)

返回结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"id": "zc199102",
"user_name": "超byr||呐,你们的小企鹅~",
"face_url": "https://static.byr.cn/uploadFace/Z/zc199102.502.gif",
"face_width": 100,
"face_height": 75,
"gender": "m",
"astro": "未知",
"life": 365,
"qq": "",
"msn": "",
"home_page": "",
"level": "用户",
"is_online": true,
......
"ajax_code": "0005",
"ajax_msg": "操作成功"
}

根据这个原理你可以查看任意用户的公开信息,或者把整个论坛爬下来。

urllib2库模拟登录北邮人论坛

urllib2库是Python自带的库,并且已经在Python3中取消。这就是我不再推荐的原因,另外下面冗长的代码也可以看出,这个库不好用。

urllib2库不支持自动管理cookies,需要导入cookielib包进行管理。因为登录的逻辑上文已经分析过,所以,这里直接贴上代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import cookielib
import urllib2
import urllib
auth_url = 'https://bbs.byr.cn/user/ajax_login.json'
data = {'id': '*********', 'passwd': '*********', }
post_data = urllib.urlencode(data)
my_header = {'x-requested-with': 'XMLHttpRequest'}
cookieJar = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookieJar))
urllib2.install_opener(opener)
req = urllib2.Request(auth_url, post_data, headers=my_header)
b = opener.open(req)
print(str(b.read()).encode('utf-8'))
user_url = "https://bbs.byr.cn/user/query/zc199102.json"
req_user = urllib2.Request(user_url, headers=my_header)
a = opener.open(req_user)
print(str(a.read()).encode('utf-8'))

执行后应该有和requests库同样的结果。

结语

刚开始写这个模拟登录的时候还是个Python的小白,当时只会使用urllib2库,因为reqeusts库需要安装,所以就特别害怕去尝试新东西。

但是,尝试之后简直发现了新世界。requests库同时支持python2和3,这点就比urllib2方便。从上文的代码对比也能更加看出requests库的强大。

如果你没用过requests库,那么我强烈推荐你尝试,你会彻底抛弃urllib2的。

人生苦短,我用Python。如果你也在用Python,那么肯定像我一样希望节省更多的时间,因此,有更好用的东西就去尝试吧!不要害怕折腾。

走心推广

因为本博客部署在Digital Ocean 服务器上,每个月都要有5美元的成本,对于学生党来说也是不小开支。所以既然你能看到这篇博客的话,希望你能帮助我一下,鼓励我写出更好的文章。

Digital Ocean 服务器购买

如果你也需要购买服务器,强烈推荐Digital Ocean,推荐原因如下:

  • 基础套餐很便宜,每月最低5美元
  • 服务器资源很给力,基础套餐配置是512MB内存,20GB的SSD硬盘,带宽不限制
  • 可以搭建ShadowSocks,实现科学上网(特别实用!!)
  • 支持ipv6,轻松解决校园网流量不够用的问题

我使用的是san francisco节点,搭建好ss之后,看油管1080p视频轻松无压力!!

你如果使用我的这个网址注册Digital Ocean,你可以得到10美元的代金券,我也能赚到一点,就是这个链接:https://m.do.co/c/86d4e56f6c7a

另外,如果你也是学生,有校园网邮箱,即可申请GitHub的Student Pack,免费送你50美刀的Digital Ocean代金券!地址是:https://education.github.com/pack/offers

菜菜手绘坊

菜菜手绘坊是我的姐姐在经营的一个手绘店铺,每一笔都是我的姐姐亲自画出来的。手绘坊里有很多风格可以选择,特别适合做头像,屏保,聊天背景等等!!甚至可以画好图之后做成手机壳,情侣T恤都是可以的!价格真的很便宜,可以加微信具体聊价格,绝对会让你惊喜!

更详细的宣传可以看我的这篇文章:http://fuxuemingzhu.me/drawing/

店主微信和QQ:290885604

下面是唯美风格的,看看有没有心动:

唯美风格:
唯美

如果满分10分,你会给这篇文章打几分?
负雪明烛 微信

微信

负雪明烛 支付宝

支付宝