(之前一直不知道简述可以用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登录的方法绕过验证码,参考第二种方法。
有什么错误或者更好的方法欢迎指正探讨。
暂时就像到这么多,想到了再继续更.....