推荐去我的博客里查看这篇文章,效果更佳:
http://fuxuemingzhu.cn/2017/08/12/byrbbs-login/

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

教程所需环境:

  • Python 2.x
  • requests 库

requests库模拟登录北邮人论坛

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

requests库的宣言是:

HTTP for Humans (给人用的 HTTP 库)

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

安装方式很简单:

pip install requests

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

import requests

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

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

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

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

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

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

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

'x-requested-with': 'XMLHttpRequest'

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

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)

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

{
"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中,也就是说只要程序没关闭,就可以访问其他数据!

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

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

返回结果如下:

{
"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包进行管理。因为登录的逻辑上文已经分析过,所以,这里直接贴上代码。

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,那么肯定像我一样希望节省更多的时间,因此,有更好用的东西就去尝试吧!不要害怕折腾。

Python实现北邮人论坛模拟登录的更多相关文章

  1. Python爬虫实战五之模拟登录淘宝并获取所有订单

    经过多次尝试,模拟登录淘宝终于成功了,实在是不容易,淘宝的登录加密和验证太复杂了,煞费苦心,在此写出来和大家一起分享,希望大家支持. 温馨提示 更新时间,2016-02-01,现在淘宝换成了滑块验证了 ...

  2. python RSA加密解密及模拟登录cnblog

    1.公开密钥加密 又称非对称加密,需要一对密钥,一个是私人密钥,另一个则是公开密钥.公钥加密的只能私钥解密,用于加密客户上传数据.私钥加密的数据,公钥可以解密,主要用于数字签名.详细介绍可参见维基百科 ...

  3. Python结合NC.exe 实现模拟登录&批量填表

    1.工作需求 有很多事项,每个事项分为:名称.种类.时间等,需要把每个事项逐个输入到网页中并提交. 如果用人肉操作的话,流程就是先登录到网站后台,点击“添加”——>输入各项内容——>点击“ ...

  4. 基于python的request库,模拟登录csdn博客

    以前爬虫用urllib2来实现,也用过scrapy的爬虫框架,这次试试requests,刚开始用,用起来确实比urllib2好,封装的更好一些,使用起来简单方便很多. 安装requests库     ...

  5. Python网络爬虫实战(四)模拟登录

    对于一个网站的首页来说,它可能需要你进行登录,比如知乎,同一个URL下,你登录与未登录当然在右上角个人信息那里是不一样的. (登录过) (未登录) 那么你在用爬虫爬取的时候获得的页面究竟是哪个呢? 肯 ...

  6. python中使用cookie进行模拟登录

    背景:使用cookie模拟登录豆瓣->我的豆瓣网页 [准备工作] 1.通过Fiddler抓取“我的豆瓣”url: 2.通过Fiddler抓取“我的豆瓣”cookie值. import urlli ...

  7. urllib库利用cookie实现模拟登录慕课网

    思路 1.首先在网页中使用账户和密码名登录慕课网 2.其次再分析请求头,如下图所示,获取到请求URL,并提取出cookie信息,保存到本地 3.最后在代码中构造请求头,使用urllib.request ...

  8. 在Python中用Request库模拟登录(三):Discuz论坛(未加密,有验证码,有隐藏验证)

    以Discuz的官方站为例.直接点击网页右上角的登录按钮,会弹出一个带验证码的登录窗口.输入验证码之后,会检查验证码是否正确.然后登录.首先,通过抓包分析,这些过程浏览器和服务器交换了哪些数据. 抓包 ...

  9. 【Python数据分析】Python模拟登录(一) requests.Session应用

    最近由于某些原因,需要用到Python模拟登录网站,但是以前对这块并不了解,而且目标网站的登录方法较为复杂, 所以一下卡在这里了,于是我决定从简单的模拟开始,逐渐深入地研究下这块. 注:本文仅为交流学 ...

随机推荐

  1. 【pheatmap热图scale报错】Error in hclust(d, method = method):NA/NaN/Inf in foreign function call (arg 11)

    初始数据类似如下: 填充下缺失值 data[data==0] <- NA data[is.na(data)] <- min(data,na.rm = T)*0.01 pheatmap(lo ...

  2. 毕业设计之zabbix集合

    lnmp环境请查看https://www.cnblogs.com/betterquan/p/12285956.html 但是!!!注意php的编译: https://www.zabbix.com/do ...

  3. nginx负均

    Nginx负载均衡详解 上一篇中我说啦nginx有哪些中负载均衡算法.这一结我就给如果操作配置的给大家做详细说明下. 首先给大家说下upstream这个配置的,这个配置是写一组被代理的服务器地址,然后 ...

  4. Flume消费内外网分流配置的Kafka时遇到的坑

    网上有铺天盖地的文章,介绍如何将Kafka同时配置成公网地址.内网地址,以实现内外网分流,看着都很成功. 但我们通过Flume消费一个配置了内外网分流的Kafka(版本0.10.1)集群时遇到了坑,却 ...

  5. c#Gridview添加颜色

    e.Row.Cells[1].ForeColor = System.Drawing.Color.Blue;

  6. A Child's History of England.12

    Dunstan, Abbot of Glastonbury Abbey, was one of the most sagacious of these monks. He was an ingenio ...

  7. AI作曲的一个点子

    通常的AI作曲都是通过拆分音乐为几个声道, 然后再把各个声道拆成音符去分析. 我忽然之间有个想法,是否可以继续拆分下去. 音符就是一些有规则的高低电平,这样把音符拆成电平. 一定会带来巨大的运算,但如 ...

  8. Qt——error之undefined reference to `vtable for classname

    可能原因:自定义类中使用自定义槽和信号,但是没有在类中增加Q_OBJECT, 解决办法:在类中增加Q_OBJECT,删除编译产生的文件进行重新编译 具体原因分析如下 博主原文

  9. Rest使用get还是post

    1. get是从服务器上获取数据,post是向服务器传送数据. 2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到.post是通过 ...

  10. 利用Lombok编写优雅的spring依赖注入代码,去掉繁人的@Autowired

    大家平时使用spring依赖注入,都是怎么写的? @Servicepublic class OrderService {@Autowiredprivate UserService userServic ...