一个小脚本,利用 urllib,urllib2,httplib,cookielib,BeautifulSoup 等库,自动化的实现一个较为复杂的登录过程,希望本文能为他人提供一些帮助。利用Chrome的调试功能,对登录过程分析之后发现,对目标页面的访问会跳转到登录页面,其中会带有隐藏的表单数据,然后输入用户名密码登录之后,再重定向到目标页面。
一。 设置带有Cookie的访问环境
就是这段代码
-
cookiejar=cookielib.CookieJar()
-
cj=urllib2.HTTPCookieProcessor(cookiejar)
-
opener=urllib2.build_opener(cj)
二。 访问页面
-
postdata=urllib.urlencode(data)
-
if postdata:
-
request=urllib2.Request(url,postdata,headers=headers)
-
else:
-
request=urllib2.Request(url,headers=headers)
-
f = opener.open(request)
首先把post的数据进行转换,然后创建request,程序会根据是否有data参数来生成GET或者是POST的请求
三。 提取需要的表单字段
-
inputs = soup.find('form').findAll('input')
-
for input in inputs:
-
name = input.get('name')
-
value = input.get('value')
-
data[name] = value
soup 元素的get方法可以获取节点的属性
四。查看 Cookie 信息
这一步可有可无,方便调试,可以看看服务器都set了那些信息
五。 获取header信息
f = opener.open(request)
f.headers.dict
上面的代码可以获取头部信息
六。 真正的登录
加入用户名和密码字段,并访问登录地址。
完整代码
-
#! /usr/bin/python
-
import urllib,urllib2,httplib,cookielib
-
from BeautifulSoup import BeautifulSoup
-
-
def log(msg,title=""):
-
if title:
-
print "for " + str(title) + ":\n"
-
print msg + "\n==========================\n\n";
-
-
def print_cookie(ck):
-
log("print the cookie")
-
for value in ck:
-
print value ,"\n";
-
-
def get_page(opener,url,data={}):
-
headers = {'Connection': 'keep-alive',
-
'Adf-Ads-Page-Id': '2',
-
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36',
-
'Adf-Rich-Message': 'true',
-
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
-
'Accept-Encoding': 'gzip, deflate'
-
}
-
-
headers = {'User-Agent': "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; "
-
+ ".NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; "
-
+ "InfoPath.2; .NET4.0E)"}
-
print data;
-
postdata=urllib.urlencode(data)
-
if postdata:
-
request=urllib2.Request(url,postdata,headers=headers)
-
else:
-
request=urllib2.Request(url,headers=headers)
-
f = opener.open(request)
-
content = f.read()
-
log(content,url);
-
return content
-
-
def get_form_data(page):
-
data = {}
-
soup = BeautifulSoup(page)
-
inputs = soup.find('form').findAll('input')
-
for input in inputs:
-
name = input.get('name')
-
value = input.get('value')
-
data[name] = value
-
return data
-
-
def get_site_page(url,name,pwd):
-
cookiejar=cookielib.CookieJar()
-
cj=urllib2.HTTPCookieProcessor(cookiejar)
-
opener=urllib2.build_opener(cj)
-
-
auto_submit_page = get_page(opener,url)
-
print_cookie(cookiejar)
-
data = get_form_data(auto_submit_page);
-
data['username'] = name
-
data['password'] = password
-
url = ""
-
submit_page = get_page(opener,url,data)
-
print_cookie(cookiejar)
-
-
if __name__=='__main__':
-
name='yourusername'
-
password='yourpassword'
-
url=''
-
get_site_page(url,name,password)
小陷阱
细心的话,可以发现代码里面有两个header,这就是搞不懂的地方,搞不懂第一个User-agent和第二个到底有什么不同,反正用第一个就是不能成功
阅读(4766) | 评论(0) | 转发(0) |