Python模拟登陆方法总结(一)

(之前一直不知道简述可以用Markdown,所以用这个格式弄了一下,代码更易读一点,内容基本没变。。。)
玩了那么久,是时候总结一波。善于总结是良好的学习方法。

模拟登录方法不少,网上也有很多,我就总结一下比较实用和经典的模拟登录方法,大牛可绕过。

1.模拟浏览器登录

这个放在第一个说是比较简单方便,用splinter库或者selenium库可以模拟键盘和鼠标按键进行登录和对浏览器的操作。

以下是代码例子。

例子说明:通过调用火狐浏览器进行模拟手工登录,所以和平常人为的登录极为相似,因此不用考虑请求和响应。

#coding=utf-8

from selenium import webdriver

import time

driver=webdriver.Firefox()  #启动火狐浏览器

url=''

driver.get(url)  #用浏览器访问url

print 'before login========='



driver.find_element_by_id("login_email").clear()  #查看源码并填入源码中用户名    的id,比如‘login_email’,该行是用来清除在登录前登录框中的字

driver.find_element_by_id("login_email").send_keys("") #输入用户名

driver.find_element_by_id("login_pwd").clear()   #查看源码并填入源码中密码的id

,比如‘login_pwd’,该行是用来清楚在登录前密码框中的字

driver.find_element_by_id("login_pwd").send_keys("")    #输入密码

driver.find_element_by_class_name("login_btn").click()   #查看源码中登录按钮的class名

time.sleep(5)

print 'After login========'

title=driver.title

print title

now_url=driver.current_url

print now_url

driver.quit()  #退出

2.“直接”登录

用requests库确实很方便,也不用进行urlencode,它自动帮你解决了url编码。

拿人人网举例(输入对了就无验证码,比较好)

两种方法:

第一种是用requests

#coding:utf-8

import requests

url="http://www.renren.com/874215543/newsfeed/focus"

login_page = "http://www.renren.com/PLogin.do"

data={"email":'',"password":''}

headers={'User-agent':'Mozilla/5.0 (Windows NT 6.3;WOW64; rv:36.0) Gecko/201    00101 Firefox/36.0'}

res = requests.post(login_page, data = data,headers=headers)

res1=requests.get(url,cookies=res.cookies,headers=headers) #这种是登录前和登录后url不同的情况

print res1.content

第二种是用requests比较高级的用法session(其实和前一个是差不多的)

#coding:utf-8

import requests

url="http://www.renren.com/874215543/newsfeed/focus"

login_page = "http://www.renren.com/PLogin.do"

data={"email":'',"password":''}   #账号密码
headers={'User-agent':'Mozilla/5.0 (Windows NT 6.3;WOW64; rv:36.0) Gecko/201    00101 Firefox/36.0'}

s = requests.session()

res = s.post(login_page, data = data,headers=headers)

res1=s.get(url)

print res1.content

3.通过cookie进行模拟登陆,也是用的最多的方法。

3-1.以下是例子。

例子说明:通过抓包获得headers和data,用程序对其进行Post登录。需要自己先手动登陆一次,获得登录之后才能访问的url,把这个url填入下面代码的url变量中。注意辨别url和login_page。login_page是登陆框把登录信息上传的地址。

#encoding=utf-8

import urllib2

import urllib

import cookielib

import re

def renrenBrower(url,user,password):

    login_page = "http://www.renren.com/PLogin.do"   #抓包分析post地址

    try:

        #构造一个opener来贮存cookie,每次都用opener来请求就可以.

         cj = cookielib.CookieJar()
         opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
         opener.addheaders = [('User-agent','Mozilla/5.0 (Windows NT 6.3; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0')]
         data = urllib.urlencode({"email":user,"password":password})
         opener.open(login_page,data)  #先请求post的url地址,拿到cookie之后再请求需要登录后才能访问的url,就是下一行。
         op=opener.open(url)   #利用得到的cookie请求该页面
         data= op.read()
         return data

     except Exception,e:
         print str(e)

html = renrenBrower("http://www.renren.com/874215543",'','')  #帐号和密码自己填
print html

还有一种情况,就是登录后的url和登录前的url不同,有些是直接在url后加了特定的参数(每个人都不一样)这个更要手动登录测试,记下自己的参数,再继续访问。

3-2.也可以先手动登录一遍再把cookie复制到headers上,这样连账号密码都不用输入,只要cookie的有效期有多长,你就能用python登录多久。如果cookie过期了,那么再复制一次就可以了。(一般用cookie模拟登录都是有验证码的时候才用,不然还是感觉挺麻烦的。。。)

以下是例子(之前的一个信息安全比赛我写的一个脚本截取一段)

#coding:utf-8

import requests

import urllib

import urllib2

import cookielib

url='http://ctf.ichunqiu.com/login/login'

url2='http://106.75.30.59:8888/'

headers={'User-agent':'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:36.0) Gecko/20    100101 Firefox/36.0','Cookie':'ci_sessionctf=636c4e1e885eddbeaa02cc37541e0a1    0f7b3d84d; __jsluid=619476a61c2f57472b7fbcaab807bd47; Hm_lvt_1a32f7c66049188    7db0960e9c314b022=1468044539; Hm_lpvt_1a32f7c660491887db0960e9c314b022=14680    44539'}   #把cookie加进来

req = urllib2.Request(url2, headers=headers)

r = urllib2.urlopen(req)

也可以将cookie存在txt中,再进行调用。

这是保存cookie。

encoding=utf-8

import urllib2  1 #coding:utf-8

import cookielib

import urllib2

#设置保存cookie的文件,同级目录下的cookie.txt

filename = 'cookie1.txt'

#声明一个MozillaCookieJar对象实例来保存cookie,之后写入文件

cookie = cookielib.MozillaCookieJar(filename)

#利用urllib2库的HTTPCookieProcessor对象来创建cookie处理器

handler = urllib2.HTTPCookieProcessor(cookie)

#通过handler来构建opener

opener = urllib2.build_opener(handler)

#创建一个请求,原理同urllib2的urlopen

response = opener.open("https://www.baidu.com")

#保存cookie到文件

cookie.save(ignore_discard=True, ignore_expires=True)

这是调用cookie。

import urllib

import cookielib

import re



#创建MozillaCookieJar实例对象

cookie = cookielib.MozillaCookieJar()

#从文件中读取cookie内容到变量

cookie.load('cookie.txt', ignore_discard=True, ignore_expires=True)

#创建请求的request

req = urllib2.Request("http://www.baidu.com")

#利用urllib2的build_opener方法创建一个opener

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))

response = opener.open(req)

print response.read()

4.绕过验证码模拟登陆

如果有验证码怎么办?

这分几种情况,如果验证码简单(字母比较正,周围没啥干扰),就可以去识别验证码,暴力进入,不过现在网站很少有这么简单了验证码。当然,难的验证码也有难的识别方法,这个不在本文讨论范围,以后可以专门写一篇关于识别验证码的。这里就用一些“巧劲”来绕过不好识别的验证码模拟登陆。

以下为网上的一个思路挺不错的例子

例子思路:先访问验证码url来获取cookie,在利用这个cookie去post你登录需要的信息。因为验证码是每次访问都在变化的,所以它一般是根据一个用户的headers来判断,确切的说应该是cookie或者referer。

#coding:utf-8

import urllib2

import cookielib

import urllib

import re

import sys



CaptchaUrl = "http://202.115.80.153/CheckCode.aspx"

PostUrl = "http://202.115.80.153/default2.aspx"

#验证码地址和post地址

cookie = cookielib.CookieJar()

handler = urllib2.HTTPCookieProcessor(cookie)

opener = urllib2.build_opener(handler)

#将cookies绑定到一个opener cookie由cookielib自动管理,和前一个例子一样,用来贮存cookie的

username = 'username'

password = 'password123'

#用户名和密码

picture = opener.open(CaptchaUrl).read()

#用openr访问验证码地址,获取cookie

local = open('e:/image.jpg', 'wb')

local.write(picture)

local.close()

#保存验证码到本地

SecretCode = raw_input('输入验证码:')

#打开保存的验证码图片 输入

postData = {

     '__VIEWSTATE': 'dDwyODE2NTM0OTg7Oz6pH0TWZk5t0lupp/tlA1L+rmL83g==',

     'txtUserName': username,

     'TextBox2': password,

     'txtSecretCode': SecretCode,

     'RadioButtonList1': '学生',

     'Button1': '',

     'lbLanguage': '',

     'hidPdrs': '',

     'hidsc': '',

 }

 #根据抓包信息 构造表单

headers = {

     'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',

     'Accept-Language': 'zh-CN,zh;q=0.8',

     'Connection': 'keep-alive',

     'Content-Type': 'application/x-www-form-urlencoded',

     'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36',

 }

 #根据抓包信息 构造headers

data = urllib.urlencode(postData)

#生成post数据?key1=value1&key2=value2的形式

request = urllib2.Request(PostUrl, data, headers)

#构造request请求

try:

 response = opener.open(request)

 result = response.read().decode('gb2312')

 #由于该网页是gb2312的编码,所以需要解码

 print result

 #打印登录后的页面

except urllib2.HTTPError, e:

 print e.code

 #利用之前存有cookie的opener登录页面

或者也可以用cookie登录的方法绕过验证码,参考第二种方法。

有什么错误或者更好的方法欢迎指正探讨。

暂时就像到这么多,想到了再继续更.....

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • HTTP cookie(也称为web cookie,网络cookie,浏览器cookie或者简称cookie)是网...
    留七七阅读 17,463评论 2 71
  • http://www.91ri.org/tag/fuzz-bug 通常情况下,有三种方法被广泛用来防御CSRF攻击...
    jdyzm阅读 4,124评论 0 5
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,015评论 11 349
  • 最近很多朋友问我怎么没有更新公众号了,我说在忙别的事情,静下来想想这十来天的时光,说长不长,说短也不短,再回头我也...
    最狸的一只阅读 202评论 0 1