(之前一直不知道簡述可以用Markdown,所以用這個格式弄了一下释漆,代碼更易讀一點悲没,內(nèi)容基本沒變。灵汪。檀训。)
玩了那么久,是時候總結(jié)一波享言。善于總結(jié)是良好的學習方法峻凫。
模擬登錄方法不少,網(wǎng)上也有很多览露,我就總結(jié)一下比較實用和經(jīng)典的模擬登錄方法荧琼,大牛可繞過差牛。
1.模擬瀏覽器登錄
這個放在第一個說是比較簡單方便命锄,用splinter庫或者selenium庫可以模擬鍵盤和鼠標按鍵進行登錄和對瀏覽器的操作。
以下是代碼例子偏化。
例子說明:通過調(diào)用火狐瀏覽器進行模擬手工登錄脐恩,所以和平常人為的登錄極為相似,因此不用考慮請求和響應(yīng)侦讨。
#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編碼韵卤。
拿人人網(wǎng)舉例(輸入對了就無驗證碼骗污,比較好)
兩種方法:
第一種是用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,用程序?qū)ζ溥M行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:
#構(gòu)造一個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后加了特定的參數(shù)(每個人都不一樣)這個更要手動登錄測試,記下自己的參數(shù)浓恶,再繼續(xù)訪問玫坛。
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中胸嘴,再進行調(diào)用雏掠。
這是保存cookie。
encoding=utf-8
import urllib2 1 #coding:utf-8
import cookielib
import urllib2
#設(shè)置保存cookie的文件劣像,同級目錄下的cookie.txt
filename = 'cookie1.txt'
#聲明一個MozillaCookieJar對象實例來保存cookie乡话,之后寫入文件
cookie = cookielib.MozillaCookieJar(filename)
#利用urllib2庫的HTTPCookieProcessor對象來創(chuàng)建cookie處理器
handler = urllib2.HTTPCookieProcessor(cookie)
#通過handler來構(gòu)建opener
opener = urllib2.build_opener(handler)
#創(chuàng)建一個請求,原理同urllib2的urlopen
response = opener.open("https://www.baidu.com")
#保存cookie到文件
cookie.save(ignore_discard=True, ignore_expires=True)
這是調(diào)用cookie耳奕。
import urllib
import cookielib
import re
#創(chuàng)建MozillaCookieJar實例對象
cookie = cookielib.MozillaCookieJar()
#從文件中讀取cookie內(nèi)容到變量
cookie.load('cookie.txt', ignore_discard=True, ignore_expires=True)
#創(chuàng)建請求的request
req = urllib2.Request("http://www.baidu.com")
#利用urllib2的build_opener方法創(chuàng)建一個opener
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
response = opener.open(req)
print response.read()
4.繞過驗證碼模擬登陸
如果有驗證碼怎么辦绑青?
這分幾種情況,如果驗證碼簡單(字母比較正吮铭,周圍沒啥干擾)时迫,就可以去識別驗證碼,暴力進入谓晌,不過現(xiàn)在網(wǎng)站很少有這么簡單了驗證碼掠拳。當然,難的驗證碼也有難的識別方法纸肉,這個不在本文討論范圍溺欧,以后可以專門寫一篇關(guān)于識別驗證碼的。這里就用一些“巧勁”來繞過不好識別的驗證碼模擬登陸柏肪。
以下為網(wǎng)上的一個思路挺不錯的例子
例子思路:先訪問驗證碼url來獲取cookie,在利用這個cookie去post你登錄需要的信息烦味。因為驗證碼是每次訪問都在變化的壁拉,所以它一般是根據(jù)一個用戶的headers來判斷,確切的說應(yīng)該是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': '',
}
#根據(jù)抓包信息 構(gòu)造表單
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',
}
#根據(jù)抓包信息 構(gòu)造headers
data = urllib.urlencode(postData)
#生成post數(shù)據(jù)?key1=value1&key2=value2的形式
request = urllib2.Request(PostUrl, data, headers)
#構(gòu)造request請求
try:
response = opener.open(request)
result = response.read().decode('gb2312')
#由于該網(wǎng)頁是gb2312的編碼痘昌,所以需要解碼
print result
#打印登錄后的頁面
except urllib2.HTTPError, e:
print e.code
#利用之前存有cookie的opener登錄頁面
或者也可以用cookie登錄的方法繞過驗證碼炬转,參考第二種方法。
有什么錯誤或者更好的方法歡迎指正探討扼劈。
暫時就像到這么多驻啤,想到了再繼續(xù)更.....