1.cookielib模块

cookielib模块的主要作用是提供可存储cookie的对象,以便于与urllib2模块配合使用来访问Internet资源。例如可以利用本模块的CookieJar类的对象来捕获cookie并在后续连接请求时重新发送。coiokielib模块用到的对象主要有下面几个:CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。其中他们的关系如下:

2.urllib2模块

说到urllib2模块最强大的部分绝对是它的opener,

urllib2模块的 OpenerDirector 操作类。这是一个管理很多处理类(Handler)的类。而所有这些 Handler 类都对应处理相应的协议,或者特殊功能。分别有下面的处理类:

  • BaseHandler
  • HTTPErrorProcessor
  • HTTPDefaultErrorHandler
  • HTTPRedirectHandler
  • ProxyHandler
  • AbstractBasicAuthHandler
  • HTTPBasicAuthHandler
  • ProxyBasicAuthHandler
  • AbstractDigestAuthHandler
  • ProxyDigestAuthHandler
  • AbstractHTTPHandler
  • HTTPHandler
  • HTTPCookieProcessor
  • UnknownHandler
  • FileHandler
  • FTPHandler
  • CacheFTPHandler

cookielib模块一般与urllib2模块配合使用,主要用在urllib2.build_oper()函数中作为urllib2.HTTPCookieProcessor()的参数。

由此可以使用python模拟网站登录。

先写个获取CookieJar实例的demo:

 1 #!/usr/bin/env python
 2 #-*-coding:utf-8-*-
 3
 4 import urllib
 5 import urllib2
 6 import cookielib
 7
 8 #获取Cookiejar对象(存在本机的cookie消息)
 9 cookie = cookielib.CookieJar()
10 #自定义opener,并将opener跟CookieJar对象绑定
11 opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
12 #安装opener,此后调用urlopen()时都会使用安装过的opener对象
13 urllib2.install_opener(opener)
14
15 url = "http://www.baidu.com"
16 urllib2.urlopen(url)

然后写个用POST方法来访问网站的方式(用urllib2模拟一起post过程):

 1 #! /usr/bin/env python
 2 #coding=utf-8
 3
 4 import urllib2
 5 import urllib
 6 import cookielib
 7
 8 def login():
 9     email = raw_input("请输入用户名:")
10     pwd = raw_input("请输入密码:")
11     data={"email":email,"password":pwd}  #登陆用户名和密码
12     post_data=urllib.urlencode(data)   #将post消息化成可以让服务器编码的方式
13     cj=cookielib.CookieJar()   #获取cookiejar实例
14     opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
15     #自己设置User-Agent(可用于伪造获取,防止某些网站防ip注入)
16     headers ={"User-agent":"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1"}
17     website = raw_input('请输入网址:')
18     req=urllib2.Request(website,post_data,headers)
19     content=opener.open(req)
20     print content.read()    #linux下没有gbk编码,只有utf-8编码
21
22 if __name__ == '__main__':
23     login()

注意这个例子经过测试,发现只有人人网和开心网之类的网站可以,而像支付宝,百度网盘,甚至是我们学校的教务系统都不能成功登录,就会显示如下的报错消息:

Traceback (most recent call last):File "login.py", line 23, in <module>login()File "login.py", line 19, in logincontent=opener.open(req)File "/usr/lib/python2.7/urllib2.py", line 406, in openresponse = meth(req, response)File "/usr/lib/python2.7/urllib2.py", line 519, in http_response'http', request, response, code, msg, hdrs)File "/usr/lib/python2.7/urllib2.py", line 444, in errorreturn self._call_chain(*args)File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chainresult = func(*args)File "/usr/lib/python2.7/urllib2.py", line 527, in http_error_defaultraise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 405: Method Not Allowed

可能是这些网站在编写时不接受客户端请求该方法,具体原因我也不知道为什么。而且这个程序不能自动通过有验证码验证的网站,所以纯粹学习它的原理吧。

然后放一下用python模拟登录的几个示例(转自:http://www.nowamagic.net/academy/detail/1302882)

#  -*- coding: utf-8 -*-
# !/usr/bin/pythonimport urllib2
import urllib
import cookielib
import reauth_url = 'http://www.nowamagic.net/'
home_url = 'http://www.nowamagic.net/';
# 登陆用户名和密码
data={"username":"nowamagic","password":"pass"
}
# urllib进行编码
post_data=urllib.urlencode(data)
# 发送头信息
headers ={"Host":"www.nowamagic.net", "Referer": "http://www.nowamagic.net"
}
# 初始化一个CookieJar来处理Cookie
cookieJar=cookielib.CookieJar()
# 实例化一个全局opener
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cookieJar))
# 获取cookie
req=urllib2.Request(auth_url,post_data,headers)
result = opener.open(req)
# 访问主页 自动带着cookie信息
result = opener.open(home_url)
# 显示结果
print result.read()

1. 使用已有的cookie访问网站

import cookielib, urllib2ckjar = cookielib.MozillaCookieJar(os.path.join('C:\Documents and Settings\tom\Application Data\Mozilla\Firefox\Profiles\h5m61j1i.default', 'cookies.txt'))req = urllib2.Request(url, postdata, header)req.add_header('User-Agent', \ 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)')opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(ckjar) )f = opener.open(req)
htm = f.read()
f.close()

2. 访问网站获得cookie,并把获得的cookie保存在cookie文件中

import cookielib, urllib2req = urllib2.Request(url, postdata, header)
req.add_header('User-Agent', \ 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)')ckjar = cookielib.MozillaCookieJar(filename)
ckproc = urllib2.HTTPCookieProcessor(ckjar)opener = urllib2.build_opener(ckproc)f = opener.open(req)
htm = f.read()
f.close()ckjar.save(ignore_discard=True, ignore_expires=True)

3. 使用指定的参数生成cookie,并用这个cookie访问网站

import cookielib, urllib2cookiejar = cookielib.CookieJar()
urlOpener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar))
values = {'redirect':", 'email':'abc@abc.com', 'password':'password', 'rememberme':", 'submit':'OK, Let Me In!'}
data = urllib.urlencode(values)request = urllib2.Request(url, data)
url = urlOpener.open(request)
print url.info()
page = url.read()request = urllib2.Request(url)
url = urlOpener.open(request)
page = url.read()
print page

另外,补充一下urllib2的方法:

1.geturl():

这个返回获取的真实的URL,这个很有用,因为urlopen(或者opener对象使用的)或许会有重定向。获取的URL或许跟请求URL不同。

URL重定向(URL redirection,或称网址重定向或网域名称转址),是指当使用者浏览某个网址时,将他导向到另一个网址的技术。常用在把一串很长的网站网址,转成较短的网址。因为当要传播某网站的网址时,常常因为网址太长,不好记忆;又有可能因为换了网路的免费网页空间,网址又必须要变更,不知情的使用者还以为网站关闭了。这时就可以用网路上的转址服务了。这个技术使一个网页是可借由不同的统一资源定位符(URL)连结。

>>> import urllib2
>>> url = "http://www.baidu.com"
>>> req = urllib2.Request(url)
>>> response = urllib2.urlopen(req)
>>> response.geturl()
'http://www.baidu.com'
>>> print response.info()
Date: Fri, 28 Mar 2014 03:30:01 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: Close
Vary: Accept-Encoding
Set-Cookie: BAIDUID=AF7C001FCA87716A52B353C500FC45DB:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BDSVRTM=0; path=/
Set-Cookie: H_PS_PSSID=1466_5225_5288_5723_4261_4759_5659; path=/; domain=.baidu.com
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Expires: Fri, 28 Mar 2014 03:29:06 GMT
Cache-Control: private
Server: BWS/1.1
BDPAGETYPE: 1
BDQID: 0xea1372bf0001780d
BDUSERID: 0

我们可以通过urllib2 默认情况下会针对 HTTP 3XX 返回码自动进行 redirect 动作(URL重定向),无需人工配置。要检测是否发生了 redirect 动作,只要检查一下 Response 的 URL 和 Request 的 URL 是否一致就可以了。

import urllib2
my_url = 'http://www.google.cn'
response = urllib2.urlopen(my_url)
redirected = response.geturl() == my_url
print redirectedmy_url = 'http://rrurl.cn/b1UZuP'
response = urllib2.urlopen(my_url)
redirected = response.geturl() == my_url
print redirected

Debug Log

使用 urllib2 时,可以通过下面的方法把 debug Log 打开,这样收发包的内容就会在屏幕上打印出来,方便调试,有时可以省去抓包的工作

import urllib2
httpHandler = urllib2.HTTPHandler(debuglevel=1)
httpsHandler = urllib2.HTTPSHandler(debuglevel=1)
opener = urllib2.build_opener(httpHandler, httpsHandler)
urllib2.install_opener(opener)
response = urllib2.urlopen('http://www.google.com')

例子:

1.关于python模拟登录,本质上是利用python脚本模拟浏览器登录,没有任何安全性问题

2.关于一些python知识,我就不多说,网上应该有很多,读者可以在网上找到很多

3.在这里附上我的人人登录,并讲一下实现步骤

#!/bin/python
#encoding=utf-8
import HTMLParser
import urlparse
import urllib
import urllib2
import cookielib
import string
import re

#登录界面的主页
hosturl="http://www.renren.com"

#这里是将用户名和密码等发送到的页面上,这里需要抓包(我的方法是打开chrome浏览器,打开到登录页面,打开“审查元素”,在里面的网络里面查到的)
posturl="http://www.renren.com/ajaxLogin/login?"

#生成cookie
cj=cookielib.LWPCookieJar()
cookie_support=urllib2.HTTPCookieProcessor(cj)
opener=urllib2.build_opener(cookie_support,urllib2.HTTPHandler)
urllib2.install_opener(opener)

#打开登录界面,获取cookie,并将该cookie保存下来
h=urllib2.urlopen(hosturl)

#构造头,这方法和上面获取posturl的方法是一样的
headers={
'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17'
,'Referer':'http://www.renren.com/SysHome.do'
}

#发送的数据,方法同上
postdata={
'captcha_type' :'web_login',
'domain' :  'renren.com',
'email' :  '********',  #用户名
'icode':  '',
'key_id':  '1',
'origURL':  'http://www.renren.com/home',
'password':  '*******************', #密码,这里是密文
'rkey':  'd0cf42c2d3d337f9e5d14083f2d52cb2'
}
 
#将数据进行编码
postdata=urllib.urlencode(postdata)

#构造一个请求消息
request=urllib2.Request(posturl,postdata,headers)
print "request:%s " %request

#发送一个请求消息
response=urllib2.urlopen(request)
text=response.read()

print "text:%s" %text

listvalue=text.split(",")

#获取到人人登录的主页,这里每个人也许会不一样,每个人需要根据自己的text的里面数据来解析
renrenhttp="http:"+listvalue[1].split(":")[2];
print "renrenhttp:%s" %renrenhttp

print urllib2.urlopen(renrenhttp).read()

4.接下来在附上自己苏大网关的python,多练几个来练手(这里就不添加注释了,注释同上)

#!/bin/python
#encoding=utf-8
import HTMLParser
import urlparse
import urllib2
import urllib
import cookielib
import string
import re

hosturl="http://wg.suda.edu.cn/index.aspx"

posturl="http://wg.suda.edu.cn/index.aspx"

cj=cookielib.LWPCookieJar()
cookie_support=urllib2.HTTPCookieProcessor(cj)
opener=urllib2.build_opener(cookie_support,urllib2.HTTPHandler)
urllib2.install_opener(opener)

h=urllib2.urlopen(hosturl)

headers={
"Referer":"http://wg.suda.edu.cn/index.aspx",
"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17"
}

postdata={
'TextBox1':'*******',  #用户名,这里都是明文
'TextBox2':'*******', #密码
'nw':'RadioButton1',
'tm':'RadioButton6',
'Button1':'登录网关'
 }

postdata=urllib.urlencode(postdata)

request=urllib2.Request(posturl,postdata,headers)
print "request:%s" %request

response=urllib2.urlopen(request)
text=response.read()
#print "text:%s" %text

5.推荐一些网站

我也是借鉴了网上的大神的文章才完成的,在这里推荐几个大神的文章

http://blog.csdn.net/lmh12506/article/details/7818306   这里是关于如何实现模拟登录的,我主要借鉴了这篇文章

http://docs.python.org/2/library/htmlparser.html  这里的文章是讲解如何解析html,便于实现自己的操作,如download 图片,这个在实现自己登录后,有很大的操作空间

cookielib和urllib2模块相结合模拟网站登录相关推荐

  1. go语言模拟网站登录并爬虫

    title: go语言模拟网站登录并爬虫 tags: go,爬虫 想要学习爬虫的朋友知道,有时候我们需要爬的网站必须登录,才能获取到数据,那么我们该怎么模拟登录呢? 需求 我们登录上网站,并且选择应用 ...

  2. python的urllib2实现登录网页_python模拟网站登录(urllib、urllib2模拟登录)

    使用python模拟登录网站,首先要知道网站登录细节及相应的cookie. 分三步完成: 1,获取一个cookie 2,装载好自己的request 3,发送模拟登录请求 推荐阅读: Python模拟新 ...

  3. C#模拟网站登录介绍

    我们在写灌水机器人.抓资源机器人和Web网游辅助工具的时候第一步要实现的就是用户登录.那么怎么用C#来模拟一个用户的登录,要实现用户的登录,那么首先就必须要了解一般网站中是怎么判断用户是否登录的. H ...

  4. pythonurllib新浪微博_python模拟登录新浪微博抓取数据(cookielib和urllib2).doc

    HYPERLINK "/article/python/22972.html" /article/python/22972.html python模拟登录新浪微博抓取数据(cooki ...

  5. pythonurllib微博登录怎么删_Python使用cookielib和urllib2模拟登陆新浪微博并抓取数据...

    我们都知道HTTP是无连接的状态协议,但是客户端和服务器端需要保持一些相互信息,比如cookie,有了cookie,服务器才能知道刚才是这个用户登录了网站,才会给予客户端访问一些页面的权限. 用浏览器 ...

  6. 微博登录记录pythonurllib_Python使用cookielib和urllib2模拟登陆新浪微博并抓取数据...

    我们都知道HTTP是无连接的状态协议,但是客户端和服务器端需要保持一些相互信息,比如cookie,有了cookie,服务器才能知道刚才是这个用户登录了网站,才会给予客户端访问一些页面的权限. 用浏览器 ...

  7. pythonurllib登录微博账号_Python使用cookielib和urllib2模拟登录新浪微博并抓取数据...

    这个方法抓下来的网页,得不到相册图片,新浪要js动态生成图片,解决方法能够是:1. 本地用webkit跑抓下来的js:2.抓移动版微博的静态相册. 但都暂时未实现,欢迎回帖好方法,如下是转文. --- ...

  8. 微博pythonurllib登陆是什么_python模拟登录新浪微博抓取数据(cookielib和urllib2)

    http是无连接的状态协议,但是客户端和服务器端需要保持一些相互信息,比如cookie,有了cookie,服务器才能知道刚才是这个用户登录了网站,才会给予客户端访问一些页面的权限. 用浏览器登录新浪微 ...

  9. 利用selenium模拟自动登录链家、贝壳、安居客等网站(超级实用,推荐收藏!)

    大家好, 今天跟大家分享一个利用selenium模拟自动登录王连某家.an聚客等网站. 文章内容超级实用,尽快在小本本上记录下来哟. 特别说明,以下代码仅用于交流学习,不做其他商业用途,切记切记! 上 ...

  10. 写了一个Windows服务,通过C#模拟网站用户登录并爬取BUG列表查询有没有新的BUG,并提醒我...

    写了一个Windows服务,通过C#模拟网站用户登录并爬取BUG列表查询有没有新的BUG,并提醒我 1.HttpUtil工具类,用于模拟用户登录以及爬取网页: using System; using ...

最新文章

  1. face-swap.zip百度网盘下载
  2. CENTOS 7安装步骤apache-tomcat-8.5.34-windows-x86
  3. springboot创建parent_Springboot 框架整理,建议做开发的都看看,整理的比较详细!...
  4. JZOJ 5490. 【清华集训2017模拟11.28】图染色
  5. daab 3.1使用笔记
  6. 刻奇·缩减·博客——当今中国博客文化之批判
  7. 第一次搭建vue项目--添加依赖包、启动项目
  8. python怎么编写流氓软件_PBot很多程序员都知道吧?深度分析一款基于python的恶意软件!...
  9. 程序员亲身体验的学历之痛
  10. [译] 搜索结果页的最佳实践
  11. STM32 ADC没有输入电压时,采集结果不为0
  12. 1.不同角度的性能测试
  13. 烧写嵌入式linux,嵌入式linux系统烧写
  14. html中禁止网页另存为、查看源文件、屏蔽鼠标右键
  15. linux触摸板设置密码程序6,Linux下Synaptics笔记本触摸板的配置
  16. 电视厂商渐进式占领“高清奥运”
  17. 十大报表工具 BI 产品深度点评-----BI报表行业专家干货分享----一文读懂报表与BI的行业现状----最新常用BI报表工具对比科普帖
  18. 声音(音乐)分类综述
  19. office案例四论文排版
  20. Python 计算思维训练——输入和错误处理练习(一)

热门文章

  1. springMVC学习(1)
  2. Linux 常用命令学习-文件及文件夹操作相关命令-持续更新
  3. 怎么让几何画板中点和点的坐标移动
  4. 21-nginx单机1W并发优化
  5. CheckBoxList 只能选2个选项
  6. 脚本实现为一系列账号生成随机密码
  7. hdu 1873“看病要排队”——优先队列的应用
  8. python计算导数_科学网—python计算导数jacobian以及hessian - 于博的博文
  9. cpu性能参数如何看?
  10. 不读取nan行_一个参数一个Excel表,让你玩转Pandas中read_excel()表格读取!