什么是cookie?

在网站中,HTTP请求时无状态的,也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是谁,cookie的出现就是为了解决这个问题,第一次登陆后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个了。cookie存储的数据量有限,不同浏览器有不同的存储大小,但一般不超过4KB,因此使用cookie只能存储一些小量的数据

cookie 的格式:

Set-Cookie: NAME=VALUE;Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE

参数意义:

NAME:cookie的名字

VALUE:cookie的值

Expires:cookie的过期时间

Path:cookie的作用路径

Domain:cookie作用的域名

SECURE:是否只在https协议下起作用

使用cookielib库和HTTPCookieProcessor模拟登陆

cookie是指网站服务器为了辨别用户身份和进行session跟踪,而存储在用户浏览器上的文本文件,cookie可以保持登陆信息到用户下次与服务器的会话,这里以人人网为例,人人网中, 要访问个人的主页,必须先登录才能访问,登陆说白了就是要有cookie信息,那么如果我们想要用代码的方式访问,就必须要有正确的cookie信息才能访问,解决方案有两种,第一种是使用浏览器访问,然后将cookie信息赋值下来,放到headers中,示例代码如下:

# 使用cookie登录人人网
from urllib import request # 人人网登陆 url : http://www.renren.com/
# 大鹏董成鹏 url : http://www.renren.com/880151247/profile # 不设置cookie信息 # dapeng_url = 'http://www.renren.com/880151247/profile'
# header = {
# 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) '
# 'Chrome/75.0.3770.100 Safari/537.36',
# }
# req = request.Request(dapeng_url, headers=header)
# res = request.urlopen(req)
# # res.read() 出来是一个bytes类型的数据,bytes-decode-str, str-encode-byte
# print(res.read().decode('utf-8'))
# with open('/Users/mac/PycharmProjects/TEST/TEST/爬虫day/file/renren.html', 'w') as f:
# f.write(res.read().decode('utf-8')) # # 设置cookie信息
# dapeng_url = 'http://www.renren.com/880151247/profile'
# header = {
# 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) '
# 'Chrome/75.0.3770.100 Safari/537.36',
# 'Cookie': 'anonymid=jxcml3nv-wfdivp; depovince=GW; _r01_=1; JSESSIONID=abcXhnCqsGEKg7eTLOrUw; '
# 'ick_login=dfc44a24-a4fd-45d9-be69-6aabe3a786c8; _'
# 'de=89E5EC670B337DC16D5D4E9A6EE4D047; first_login_flag=1; ln_uact=15666809216; '
# 'ln_hurl=http://hdn.xnimg.cn/photos/hdn121/20130503/2205/h_main_pQ5D_d0a700000241111a.jpg; id=447270940; '
# 'jebecookies=07393439-a951-4642-ad39-a68eaac5558a|||||; '
# 'p=0bd1602e02b8a9766402dd5917df60070; '
# 't=5d0757048b69b35c0bd06fbf6c8aa7d10; societyguester=5d0757048b69b35c0bd06fbf6c8aa7d10; xnsid=6e55b64f; '
# 'ver=7.0; loginfrom=null; '
# 'jebe_key=5942f4fe-f07c-450a-a9c0-9ef5ce16e6db%7C619532812667f7915f71d620643dd5ba%7C1561516986287%7C1%7C1561516986309; '
# 'jebe_key=5942f4fe-f07c-450a-a9c0-9ef5ce16e6db%7C619532812667f7915f71d620643dd5ba%7C1561516986287%7C1%7C1561516986313; '
# 'wp=1; wp_fold=1'
# }
# req = request.Request(dapeng_url, headers=header)
# res = request.urlopen(req)
# # res.read() 出来是一个bytes类型的数据,bytes-decode-str, str-encode-byte
# print(res.read().decode('utf-8'))
# with open('/Users/mac/PycharmProjects/TEST/TEST/爬虫day/file/renren2.html', 'w') as f:
# f.write(res.read().decode('utf-8'))
# cookie模拟自动登录

"""
http cookiejar 模块
该模块主要的类有cookiejar,FileCookieJar, MozillaCookieJar,LWPCookieJar 这四个类的作用分别如下:
1,CookieJar:管理HTTP cookie值,存储HTTP请求生成的cookie,向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对cookiejar
实例进行垃圾回收后cookie也将丢失
2,FileCookieJar(filename, delayload=None,policy=None);从FileCookieJar派生而来,用来创建FileCookieJar实例,检索cookie信息并将
Cookie存储到文件中,filename是存储cookie的文件名,delayload为True时支持延迟访问文件,即只有在需要时才读取文件或在文件中存储数据。
3,MozillaCookieJar(filename, delayload=None,policy=None),从FileCookieJar派生而来,创建于Mozilla浏览器cookies.txt兼容的
FileCookieJar实例
4,LWPCookieJar(filename, delayload=None,policy=None)),从FileCookieJar派生而来,创建与libwww.per标准的Set_Cookie3文件格式兼容的
FileCookieJar实例
利用http.cookiejar 和 request.HTTPCookierProcessor登录人人网,相关代码如下:
""" from http.cookiejar import CookieJar
from urllib.parse import urlencode header = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/75.0.3770.100 Safari/537.36', } # 第一步登录
"""
1.1 创建一个cookiejar对象
1.2,使用cookiejar创建一个HTTPCookieProcessor对象
1.3,使用上一步创建的handler创建一个opener
1.4, 使用opener发送登录的请求(人人网的邮箱和密码)
""" cookieJar = CookieJar()
handler = request.HTTPCookieProcessor(cookieJar)
opener = request.build_opener(handler)
url = 'http://www.renren.com/PLogin.do'
data = {
'email': '15666809216',
'password': 'beauty234',
}
param_parse = urlencode(data)
req = request.Request(url, data=param_parse.encode('utf-8'), headers=header)
res = opener.open(req)
# 第二部 访问某人主页
dapeng_url = 'http://www.renren.com/880151247/profile'
# 不用新建opener,因为之前的已经包含了登录所需要的cookie信息
resp = request.Request(dapeng_url, headers=header)
req2 = opener.open(resp)
with open('/Users/mac/PycharmProjects/TEST/TEST/爬虫day/file/renren3.html', 'w', encoding='utf-8') as f:
f.write(req2.read().decode('utf-8'))

代码优化

from http.cookiejar import CookieJar
from urllib.parse import urlencode header = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/75.0.3770.100 Safari/537.36', } # 第一步登录
"""
1.1 创建一个cookiejar对象
1.2,使用cookiejar创建一个HTTPCookieProcessor对象
1.3,使用上一步创建的handler创建一个opener
1.4, 使用opener发送登录的请求(人人网的邮箱和密码)
""" def get_opener():
cookieJar = CookieJar()
handler = request.HTTPCookieProcessor(cookieJar)
opener = request.build_opener(handler)
return opener def login_renren(opener): url = 'http://www.renren.com/PLogin.do'
data = {
'email': '15666809216',
'password': 'beauty234',
}
param_parse = urlencode(data)
req = request.Request(url, data=param_parse.encode('utf-8'), headers=header)
res = opener.open(req)
return res def visit_home(opener):
# 第二部 访问某人主页
dapeng_url = 'http://www.renren.com/880151247/profile'
# 不用新建opener,因为之前的已经包含了登录所需要的cookie信息
resp = request.Request(dapeng_url, headers=header)
req2 = opener.open(resp)
with open('/Users/mac/PycharmProjects/TEST/TEST/爬虫day/file/renren3.html', 'w', encoding='utf-8') as f:
f.write(req2.read().decode('utf-8')) if __name__ == 'main':
opener = get_opener()
login_renren(opener)
visit_home(opener)

爬虫模拟cookie自动登录(人人网自动登录)的更多相关文章

  1. C#_自动化测试1_模拟post,get_12306火车票网站自动登录工具

    还记得2011年春运,12306火车票预订网站经常崩溃无法登录吗. 今天我们就开发一个12306网站自动登录软件. 帮助您轻松订票 通过前两篇博客Fiddler教程和HTTP协议详解,我们了解了Web ...

  2. spring mvc 用cookie和拦截器实现自动登录(/免登录)

    Cookie/Session机制详解:http://blog.csdn.net/fangaoxin/article/details/6952954 SpringMVC记住密码功能:http://blo ...

  3. 用python实现模拟登录人人网

    用python实现模拟登录人人网 字数4068 阅读1762 评论19 喜欢46 我决定从头说起.懂的人可以快速略过前面理论看最后几张图. web基础知识 从OSI参考模型(从低到高:物理层,数据链路 ...

  4. Java豆瓣电影爬虫——模拟登录的前世今生与验证码的爱恨情仇

    前言 并不是所有的网站都能够敞开心扉让你看个透彻,它们总要给你出些难题让你觉得有些东西是来之不易的,往往,这也更加激发你的激情和斗志! 从<为了媳妇的一张号,我与百度医生杠上了>里就有网友 ...

  5. spring boot:spring security给用户登录增加自动登录及图形验证码功能(spring boot 2.3.1)

    一,图形验证码的用途? 1,什么是图形验证码? 验证码(CAPTCHA)是"Completely Automated Public Turing test to tell Computers ...

  6. 无密钥登录的自动脚本实现(ssh-copy-id、expect免交互输入脚本)

    感谢朋友支持本博客,欢迎共同探讨交流,由于能力和时间有限,错误之处在所难免,欢迎指正! 如有转载,请保留源作者博客信息. Better Me的博客:blog.csdn.net/tantexian 如需 ...

  7. 用户点击确认登录,自动跳转下面地址得到code

    PHP获取微信openid 简单教程 WEB   2014年10月29日  10868浏览  6评论 获取code https://open.weixin.qq.com/connect/oauth2/ ...

  8. Linux配置SSH公钥认证与Jenkins远程登录进行自动发布

    公钥认证,是使用一对加密字符串,一个称为公钥(public key), 任何人都可以看到其内容,用于加密:另一个称为密钥(private key),只有拥有者才能看到,用于解密. 在使用jenkins ...

  9. 解决Ecshop因为动态ip问题登录后台自动退出

    解决Ecshop因为动态ip问题登录后台自动退出 PHP  铁匠  2年前 (2013-07-21)  1130℃  0评论 修改lib_base.php文件real_ip()函数,添加以下代码即可解 ...

随机推荐

  1. Linux - bash - 小坑: IFS

    1. 概述 for 循环读取文件内容时, 输出被打得稀碎 2. 场景 需求 读入文件 逐行显示 源文件 Continuous Delivery with Docker and Jenkins Jenk ...

  2. POCO的理解

    POCO的名称有多种,pure old clr object. plain ordinary clr object等 POCO的概念是指那些没有从任何类继承,也没有实现任何接口,更没有被其它框架侵入的 ...

  3. select2多选框初始化默认值和获得值

    select2多选自带手动输入搜索功能,可怜我还查寻半天api 获得值: //chang函数获取选择的option $(".js-example").change(function ...

  4. python学习之matplotlib绘制动图(FuncAnimation()参数)

    1.函数FuncAnimation(fig,func,frames,init_func,interval,blit)是绘制动图的主要函数,其参数如下: a.fig 绘制动图的画布名称 b.func自定 ...

  5. 本次我们使用idea构建springmvc项目

    该案例的github地址:https://github.com/zhouyanger/demo/tree/master/springmvcdemo1 1.首先我们可以创建maven项目,file-&g ...

  6. websocket协议实现

    # websocket协议实现 1.抓包 wireshark规则: tcp.port == 9000 2. 结果解析 客户端请求: GET /ws/test_2 HTTP/1.1 Host: loca ...

  7. handler method 参数绑定

    handler method 参数绑定常用的注解,我们根据他们处理的Request的不同内容部分分为四类:(主要讲解常用类型) A.处理requet uri 部分(这里指uri template中va ...

  8. 对图书管理系统5W1H的分析

    5W1H 对图书管理系统的分析 1.Who 学生.老师和图书馆管理员 2.When 借还书的时候使用,还有用户流量的统计在每天晚上都会看一下有多少人哪些人看了的,基本绝大多数时间都可以看 3.Wher ...

  9. 命令行选项解析函数getopt()

    1.定义: int getopt(int argc, char * const argv[], const char *optstring); 2.描述: getopt是用来解析命令行选项参数的,但是 ...

  10. python3将json数据转换到excel中

    #!/usr/bin/env python# coding=utf-8# json转换为excel import xlrdimport jsonimport osfrom openpyxl impor ...