1. Cookie简介(详见百度百科)
Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。定义于 RFC2109 和 2965 中的都已废弃,最新取代的规范是 RFC6265。(可以叫做浏览器缓存)
Cookie,意思是“小甜点”,存储的数量有限,不同的浏览器有不同的存储大小,但一般不超过4kb。
cookie的格式:
# --coding:utf-8-- # # cookie的格式: # Set-Cookie: NAME=VALUE: Expires/Max-age-DATE: Path=PATH: Domain=DOMAIN_NAME: SECURE # 参数的意义: # NAME:cookie的名字 # VALUE::cookie的值 # Expires:cookie的过期时间 # Path:cookie作用的路径 # Domain:cookie作用的域名 # SECURE:是否在https协议下起作用
2. 使用Cookie和HTTPCookieProcessor模拟登陆
有些网站在访问某个人的主页,必须先登录才能访问,登陆说白了就是要有cookie信息。那么如果我们想要用代码的方式访问,就必须要有正确的cookie信息才能访问。解决方案有两种
(1)第一种是使用浏览器访问,然后将cookie信息复制下来,放到headers中,示例代码如下:
# --coding:utf-8-- # import urllib2 # 1. 不使用cookie去请求网站“http://www.renren.com/410203840/profile” person_url = "http://www.renren.com/410203840/profile" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36" } req = urllib2.Request(url=person_url, headers=headers) resp = urllib2.urlopen(req) with open("C:\\Users\\Administrator\\Desktop\\notcookie.html", "w") as fp: # write函数必须写入一个str的数据类型 # resp.read()读出来的是一个bytes数据类型 # bytes -> decode -> str # str -> encode -> bytes # fp.write(resp.read().decode('utf-8')) fp.write(resp.read()) # 2. 使用cookie去请求网站“http://www.renren.com/410203840/profile” person_url0 = "http://www.renren.com/410203840/profile" headers0 = { "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", "Cookie": "wP_h=274634eb0dde4425e245fb116e3b2815876463c0; anonymid=ji4qelyh-9q1mm6; depovince=GW; _r01_=1; JSESSIONID=abc3MdXtmkNRy4Zat-Apw; ick_login=64c8fe32-3b8a-4c28-8b0d-1cbd2413a268; __utma=151146938.630660969.1528387907.1528387907.1528387907.1; __utmc=151146938; __utmz=151146938.1528387907.1.1.utmcsr=renren.com|utmccn=(referral)|utmcmd=referral|utmcct=/; ick=6031132c-f3f8-4522-a9fa-05f3d9896a2c; _de=426D9275B2D2D9FAA134AD7773858BDB; t=1e9adf0614c1e6410d231919dbe055e05; societyguester=1e9adf0614c1e6410d231919dbe055e05; id=966343165; xnsid=24f8124b; XNESSESSIONID=33807365f6a6; ch_id=10016; wp_fold=0; jebecookies=07a35f66-baa5-4f2b-90e7-b2040df0f12c|||||; jebe_key=bcfdf5f1-4130-400d-883c-3e69502ce52c%7C7ba940edb19430bf2d01d07d26712600%7C1528389711605%7C1; jebe_key=bcfdf5f1-4130-400d-883c-3e69502ce52c%7C7ba940edb19430bf2d01d07d26712600%7C1528389711605%7C1%7C1528389833434" } req0 = urllib2.Request(url=person_url0, headers=headers0) resp0 = urllib2.urlopen(req0) with open("C:\\Users\\Administrator\\Desktop\\cookie.html", "w") as fp: # write函数必须写入一个str的数据类型 # resp.read()读出来的是一个bytes数据类型 # bytes -> decode -> str # str -> encode -> bytes # fp.write(resp.read().decode('utf-8')) fp.write(resp0.read())
(2)第二种方法是用cookielib模块、urllib2中的HTTPCookieProcessor方法模拟登陆。示例代码如下:
# --coding:utf8-- # import urllib import urllib2 import cookielib headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", } def get_opener(): # 1. 登陆 # 1.1 创建一个cookiejar对象 cookiejar = cookielib.CookieJar() # 1.2 使用CookieJar创建一个HTTPCookieProcess对象 handler = urllib2.HTTPCookieProcessor(cookiejar) # 1.3 使用已经创建的handler创建一个opener opener = urllib2.build_opener(handler) return opener def login_renren(opener): # 1.4 使用opener发送登陆的请求(登陆某人网的账号和密码) # 自己的账号和自己的密码 data = { "email": "[email protected]", "password": "pythonspider" } login_url = "http://www.renren.com/PLogin.do" req = urllib2.Request(login_url, data=urllib.urlencode(data).encode("utf-8"), headers=headers) opener.open(req) def visit_profile(opener): # 2 访问个人主页 person_url = "http://www.renren.com/410203840/profile" # 获取个人主页的页面的时候,不要新建一个opener。应该使用之前那个opener, # 因为之前那个opener已经包含了登陆所需要的cookie信息 resp = opener.open(person_url) with open("C:\\Users\\Administrator\\Desktop\\incookie.html", "w") as f: f.write(resp.read()) if __name__ == '__main__': opener = get_opener() login_renren(opener) visit_profile(opener)
3. cookie信息的加载与保存
# --coding:utf-8-- # # cookie信息的加载与保存 import urllib import urllib2 import cookielib cookiejar = cookielib.MozillaCookieJar("C:\\Users\\Administrator\\Desktop\\cookie.txt") cookiejar.load(ignore_discard=True) handler = urllib2.HTTPCookieProcessor(cookiejar) opener = urllib2.build_opener(handler) resp = opener.open("http://httpbin.org/cookies/set?freeform=abc") # ignore_discard=True 忽略被抛弃的东西(忽略过时的cookie信息) cookiejar.save(ignore_discard=True) for cookie in cookiejar: print cookie print "Cookie保存成功"
以上就是这两种方法,仅供参考,欢迎交流。