Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2454012
  • 博文数量: 328
  • 博客积分: 4302
  • 博客等级: 上校
  • 技术积分: 5486
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-01 11:14
个人简介

悲剧,绝对的悲剧,悲剧中的悲剧。

文章分类

全部博文(328)

文章存档

2017年(6)

2016年(18)

2015年(28)

2014年(73)

2013年(62)

2012年(58)

2011年(55)

2010年(28)

分类: Python/Ruby

2015-01-27 16:41:33

一个小脚本,利用 urllib,urllib2,httplib,cookielib,BeautifulSoup 等库,自动化的实现一个较为复杂的登录过程,希望本文能为他人提供一些帮助。利用Chrome的调试功能,对登录过程分析之后发现,对目标页面的访问会跳转到登录页面,其中会带有隐藏的表单数据,然后输入用户名密码登录之后,再重定向到目标页面。

一。 设置带有Cookie的访问环境

就是这段代码
  1.     cookiejar=cookielib.CookieJar()
  2.     cj=urllib2.HTTPCookieProcessor(cookiejar)
  3.     opener=urllib2.build_opener(cj)

二。 访问页面

  1.     postdata=urllib.urlencode(data)
  2.     if postdata:
  3.         request=urllib2.Request(url,postdata,headers=headers)
  4.     else:
  5.         request=urllib2.Request(url,headers=headers)
  6.     f = opener.open(request)

首先把post的数据进行转换,然后创建request,程序会根据是否有data参数来生成GET或者是POST的请求

三。 提取需要的表单字段

  1.     inputs = soup.find('form').findAll('input')
  2.     for input in inputs:
  3.         name = input.get('name')
  4.         value = input.get('value')
  5.         data[name] = value
soup 元素的get方法可以获取节点的属性

四。查看 Cookie 信息

这一步可有可无,方便调试,可以看看服务器都set了那些信息

五。 获取header信息

f = opener.open(request)
f.headers.dict
上面的代码可以获取头部信息

六。 真正的登录

加入用户名和密码字段,并访问登录地址。

完整代码
  1. #! /usr/bin/python
  2. import urllib,urllib2,httplib,cookielib
  3. from BeautifulSoup import BeautifulSoup

  4. def log(msg,title=""):
  5.     if title:
  6.         print "for " + str(title) + ":\n"
  7.     print msg + "\n==========================\n\n";

  8. def print_cookie(ck):
  9.     log("print the cookie")
  10.     for value in ck:
  11.         print value ,"\n";

  12. def get_page(opener,url,data={}):
  13.     headers = {'Connection': 'keep-alive',
  14.         'Adf-Ads-Page-Id': '2',
  15.         'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36',
  16.         'Adf-Rich-Message': 'true',
  17.         'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
  18.         'Accept-Encoding': 'gzip, deflate'
  19.         }

  20.     headers = {'User-Agent': "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; "
  21.             + ".NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; "
  22.             + "InfoPath.2; .NET4.0E)"}
  23.     print data;
  24.     postdata=urllib.urlencode(data)
  25.     if postdata:
  26.         request=urllib2.Request(url,postdata,headers=headers)
  27.     else:
  28.         request=urllib2.Request(url,headers=headers)
  29.     f = opener.open(request)
  30.     content = f.read()
  31.     log(content,url);
  32.     return content

  33. def get_form_data(page):
  34.     data = {}
  35.     soup = BeautifulSoup(page)
  36.     inputs = soup.find('form').findAll('input')
  37.     for input in inputs:
  38.         name = input.get('name')
  39.         value = input.get('value')
  40.         data[name] = value
  41.     return data

  42. def get_site_page(url,name,pwd):
  43.     cookiejar=cookielib.CookieJar()
  44.     cj=urllib2.HTTPCookieProcessor(cookiejar)
  45.     opener=urllib2.build_opener(cj)

  46.     auto_submit_page = get_page(opener,url)
  47.     print_cookie(cookiejar)
  48.     data = get_form_data(auto_submit_page);
  49.     data['username'] = name
  50.     data['password'] = password
  51.     url = ""
  52.     submit_page = get_page(opener,url,data)
  53.     print_cookie(cookiejar)

  54. if __name__=='__main__':
  55.     name='yourusername'
  56.     password='yourpassword'
  57.     url=''
  58.     get_site_page(url,name,password)

小陷阱

细心的话,可以发现代码里面有两个header,这就是搞不懂的地方,搞不懂第一个User-agent和第二个到底有什么不同,反正用第一个就是不能成功
阅读(4766) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~