1、cookies和session

1.1、什么是cookie和session?

cookie是网站用来辨别用户身份,进行会话跟踪,存储在本地终端上的数据。

session(会话)起来本含义是指有始有终的一系列动作和消息。

在web中,session主要用来在服务器端存储特定用户对象会话所需要的信息。

1.2、cookie和session产生的原因:

http协议是一个无状态协议,在特定操作的时候,需要保存信息,进而产生了cookie和session。

1.3、cookie原理:

由服务器来产生,浏览器第一次请求,服务器发送给客户端进而保存,浏览器继续访问时,就会在请求头的cookie字段上附带cookie信息,这样服务器就可以识别是谁在访问了。

但是cookie存在缺陷:

1、不安全--本地保存,容易被篡改。

2、大小受限,本身最大4kb。

cookie虽然在一定程度上解决了‘保持状态’的需求,但是我们希望有一种新的技术可以克服cookie缺陷,这种技术就是session。

1.4、session

session在服务器保存。----解决安全问题。

问题来了:服务器上的session,但是客户端请求发送过来,服务器如何知道session_a,session_b,到底和那个请求对应。

所以为了解决这个问题:cookie就作为这个桥梁。在cookie有一个sessionid字段,可以用来表示这个请求对应服务器中的哪一个session。

禁用cookie,一般情况下,session也无法使用。特殊情况下可以使用url重写技术来使用session。

url重写技术:将sessionid拼接到url里面。

session的生命周期:服务器创建开始,有效期结束(一般网站设定都是大约30分钟左右),就删除。

1.5、cookie常用字段
    "domain": ".baidu.com",   #主机名
"expirationDate": 1607430402.780818, #过期时间(时间戳=>等价于Tue Dec 8 20:26:42 2020)
"name": "BAIDUID", #字段名
"path": "/", #主机哪个路径下设置的cookie
"secure": false, 是否安全传输
"value": "FC48EB3E32989D00F7BFCA9AF76D009A:FG=1", #字段值
"id": 1 #cookiesid
1.6、会话cookie和持久cookie

会话cookies:

​ "expirationDate"的值为负数,则关闭浏览器时cookie 即失效,保存在内存中的cookie。

持久cookies

​ "expirationDate": 1607430402.780818 , 则该cookie 在时间为expirationDate的时候失效。 保存在硬盘上的cookie

持久化:将内存中数据持久化到硬盘上。其实就是数据保存到文件或者数据库中。

内存主要的作用就是由于速度快,启动应用软件或者程序的时候,就会分配一定内存空间作为该程序的执行空间。

内存一旦断电,就会被清空。

1.7、通过cookies 登录github页面
cookies 在requests中使用的第一种方式(将cookies放置在headers中)
import requests

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36',
'Cookie': '_octo=GH1.1.90071fdfg1199.1575898561; _device_id=78c6d6dc75b0d87dg7afb73742a9679aa9; _ga=GA1.2.1521343976.1575898582; has_recent_activity=1; tz=Asia%2FShanghai; experiment:homepage_signup_flow=eyJ2ZXJzaW9uIjoiMSIsInJvbGxPdXRQbGFjZW1lbnQiOjM1LjE2NzQ2NjU3Nzg3OTk1Niwic3ViZ3JvdXAiOm51gdfbGwsImNyZWF0ZWRBdCI6IjIwMjAtMDMtMThUMDI6MDQ6MjMuODA4WiIsInVwZGF0ZWRBdCI6IjIwMjAtMDMtMjVUMDQ6MTk6MTUuNjA5WiJ9; user_session=jk2HfEj_4gWfU8V_4dvps7naVFFB_R0aUn4_mVrdxnQWy9u7; __Host-user_session_same_site=jk2HfEj_4gWfU8V_4dvps7naVFFB_R0aUn4_mVrdxnQWy9u7; logged_in=yes; dotcom_user=2829507692; _gh_sess=x0LIdSUTKSwhKICq0QYKsXlDJULU%2BjhBdrK8NzsFYwNIUOHV0gYsMgjLZ%2B8YgTBoSp%2FjMZXHhuMfdD4dr7sqV%2F1IF%2BA0GnYV6J%2BsyyoMxpoz%2BVOdYGWqUi4p5KOIxm6VAOyePx6fEM21VAGMdEqq9EXErfH0n3j81aFFQeKYv3TgkEWqpYbD6DNKWrUOB%2FrbwmyND0z%2BdjrTLDE6YbZnwZwEoaiIZUhd6Rd265uMBD%2B38uNc7jHQRl1TVrfPwHTHXi%2BfE4LSzMOZalVQgoNlGxi0o0QXwa%2F12pt97CFIUjnSIqYwBEEVkl81pVBhjVzkKWQsKLPaSArMJ3wDPBKHegQCRLZ3u2lMa2%2BZTLKnOsA20%2BX9Z%2B2DdRPL9UHusnUME%2F77KC4V%2FNrHMKnPkLC2dpZFojKSZscTpjBB4PeYF4KV84sMOMrxQlHetWDKN8%2BcjSuHPOGdf2qHq67AbyaRsoyFK3T2cQocIqJh9pYEQwmnm%2FasWoP82PsAn%2FbujQY%2BzJq1iVWxVUCH0nc5mShuwJg0AJBjAiaFwSvCjWF5eUFYmKTA9Bk%2FpH254MbDb8ofJsWJs6m1oycxEuJogMHkxZuIrWGIQezG%2BBYODyTJOco4oGRp11dVTPZLXTj3Vet0pwvL749B8hfmskK%2F4w2mvErIoxxe6yy1u0kgwgq4xIcgwmsdfg0I7ZUQC6ak0cGNfOeomjoTSPNLT0DZoUFW4WSjhiGgxIiUowPFB9PQ9FCvxrw8%2FyV0foedzTKQVZUnru7Ik4XkYpKakmfzZRPn5soED4XFgJVmzTB4xVxQSHNzsDgwBWupZYxE5dcYitWVr3OrMYAeqzpc%2BVbEs8%2BtWNpKDlJDOMYQfsqwGexThnNYlj2IvnIz0aQydEva%2FNcZNlHOiEaD%2BN8xdMyqd2GTydT1LjkizWv4SofUNjroCj3mgggH2hCcOwRUhcYUJZt8Z6gW7JYiLCxQqnjVrJBc%2Bw2dgg1scohQhZ6PXkk5IqvX3p2mP2Xq967TEqr4bqntFcARsTUM4bT54D81XHiS6g1Rue0QmXu3pxe%2BEiMpoptbMRcQFsPQqE8PhweZKCL9ZOW0637rmt4qVNuQdvfGi9N2Bs9aO4PjDk%2Brrj5tWhSSzdCRUbYWzhtNj9CXImyQZoTZ7aPKrgRd2tjiEl5l61uPfdAvd%2FXv4dKxXbUlIb3TLhNsmJExDgdgfj7CoSiysaKwluM4D2Ggbk9xqtvSI9g57PweEA%2BhoxnjZKI0It65ZgZ5bIX7ipEEAo14uLPsqGut6ittBEp1UT5xELjUaM6LPto%2F9IPLlG4U8mdb3u7xx%2BuTakRu7yfbabDUkv0QXY9nsg3u27eTg097WErlgeB7jqf%2Flc%2Ft8laI%2B641xqA2kKKcr38PYwrkbySJyf5TMjgLop6qFCo738w%2B8J409OIEqNREN0IoW0DrfELoHmAkhMAYyzY2Yynbs3973wyyOTZUwNvm4K0mQQ%3D%3D--07oaTkbSmNfGWujT--xcmABMjlD5SJ9u8LnSFp%2Bwdsf%3D%3D'
}
url = 'https://github.com/' res = requests.get(url, headers=headers).content.decode('utf-8')
if 'username' in res:
print('login True')
cookies 在requests中使用的第一种方式(将cookies放置在cookies参数中)
import requests

cookies='_octo=GH1.1.900711199.1575898561; _device_id=78c6d6dc75b0d877afb73742a9679aa9; _ga=GA1.2.1521343976.1575898582; has_recent_activity=1; tz=Asia%2FShanghai; experiment:homepage_signup_flow=eyJ2ZXJzaW9uIjoiMSIsInJvbGxPdXRQbGFjZW1lbnQiOjM1LjE2NzQ2NjU3Nzg3OTk1Niwic3ViZ3JvdXAiOm51bGwsImNyZWF0ZWRBdCI6IjIwMjAtMDMtMThUMDI6MDQ6MjMuODA4WiIsInVwZGF0ZWRBdCI6IjIwMjAtMDMtMjVUMDQ6MTk6MTUuNjA5WiJ9; user_session=jk2HfEj_4gWfU8V_4dvps7naVFFB_R0aUn4_mVrdxnQWy9u7; __Host-user_session_same_site=jk2HfEj_4gWfU8V_4dvps7naVFFB_R0aUn4_mVrdxnQWy9u7; logged_in=yes; dotcom_user=2829507692; _gh_sess=x0LIdSUTKSwhKICq0QYKsXlDJULU%2BjhBdrK8NzsFYwNIUOHV0gYsMgjLZ%2B8YgTBoSp%2FjMZXHhuMfdD4dr7sqV%2F1IF%2BA0GnYV6J%2BsyyoMxpoz%2BVOdYGWqUi4p5KOIxm6VAOyePx6fEM21VAGMdEqq9EXErfH0n3j81aFFQeKYv3TgkEWqpYbD6DNKWrUOB%2FrbwmyND0z%2BdjrTLDE6YbZnwZwEoaiIZUhd6Rd265uMBD%2B38uNc7jHQRl1TVrfPwHTHXi%2BfE4LSzMOZalVQgoNlGxi0o0QXwa%2F12pt97CFIUjnSIqYwBEEVkl81pVBhjVzkKWQsKLPaSArMJ3wDPBKHegQCRLZ3u2lMa2%2BZTLKnOsA20%2BX9Z%2B2DdRPL9UHusnUME%2F77KC4V%2FNrHMKnPkLC2dpZFojKSZscTpjBB4PeYF4KV84sMOMrxQlHetWDKN8%2BcjSuHPOGdf2qHq67AbyaRsoyFK3T2cQocIqJh9pYEQwmnm%2FasWoP82PsAn%2FbujQY%2BzJq1iVWxVUCH0nc5mShuwJg0AJBjAiaFwSvCjWF5eUFYmKTA9Bk%2FpH254MbDb8ofJsWJs6m1oycxEuJogMHkxZuIrWGIQezG%2BBYODyTJOco4oGRp11dVTPZLXTj3Vet0pwvL749B8hfmskK%2F4w2mvErIoxxe6yy1u0kgwgq4xIdacgwm0I7ZUQC6ak0cGNfOeomjoTSPNLT0DZoUFW4WSjhiGgxIiUowPFB9PQ9FCvxrw8%2FyV0foedzTKQVZUnru7Ik4XkYpKakmfzZRPn5soED4XFgJVmzTB4xVxQSHNzsDgwBWupZYxE5dcYitWVr3OrMYAeqzpc%2BVbEs8%2BtWNpKDlJDOMYQffasdfsqwGexThnNYlj2IvnIz0aQydEva%2FNcZNlHOiEaD%2BN8xdMyqd2GTydT1LjkizWv4SofUNjroCj3mgggH2hCcOwRUhcYUJZt8Z6gW7JYiLCxQqnjVrJBc%2Bw2dgg1scohQhZ6PXkk5IqvX3p2mP2Xq967TEqr4bqntFcARsTUM4bT54D81XHiS6g1Rue0QmXu3pxe%2BEiMpoptbMRcQFsPQqE8PhweZKCL9ZOW0637rmt4qVNuQdvfGi9N2Bs9aO4PjDk%2Brrj5tWhSSzdCRUbYWzhtNj9CXImyQZoTZ7aPKrgRd2tjiEl5l61uPfdAvd%2FXv4dKxXbUlIb3TLhNsmJExDj7CoSiysaKwluM4D2Ggbk9xqtvSI9g57PweEA%2BhoxnjZKI0It65ZgZ5bIX7ipEEAo14uLPsqGut6ittBEp1UT5xELjUaM6LPto%2F9IPLlG4U8mdb3u7xx%2BuTakRu7yfbabDUkv0QXY9nsg3u27eTg097WErlgeB7jqf%2Flc%2Ft8laI%2B641xqA2kKKcr38PYwrkbySJyf5TMjgLop6qFCo738w%2B8J409OIEqNREN0IoW0DrfELoHmAkhMAYyzY2Yynbs3973wyyOTZUwNvm4K0mQQ%3D%3D--07oaTkbSmNfGWujT--xcmABMjlD5SJ9u8LnSFp%2Bw%3D%3D'
cookies_dic={item.split('=')[0]:item.split('=')[1]for item in cookies.split('; ') }
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36',
}
url = 'https://github.com/' res = requests.get(url, headers=headers,cookies=cookies_dic).content.decode('utf-8')
if 'username' in res:
print('login True')
1.9、通过构建data字典+Session对象,登录github
1.9.1、通过分析url(https://github.com/session)可知,发送post请求时需要传递以下参数。
commit: Sign in
authenticity_token: 9Ek9mN5qMK7Mr3DS3goFGj1zJcsywLXMA6eLMoZ3fLaW8z4SXuc6Qugv6H2/gyvfjAVOaqxpxHKvCVkUQa1SZg==
login: username
password: password
webauthn-support: supported
webauthn-iuvpaa-support: supported
return_to:
required_field_6c85:
timestamp: 1585111598578
timestamp_secret: 79735a7473e5c621225663e9f306bc3f1ea61c3926869e33200415096b3350c6

但是如果我们通过Session对象,先访问登录页面(https://github.com/login),则session对象中会保存一部分cookies数据,则我们只需传递如下几个参数。

commit: Sign in
authenticity_token: 91zJcsywLXMA6eLMoZ3fLaW8z4SXuc6Qugv6H2/gyvfjAVOaqxpxHKvCVkUQa1SZg==
login: username
password: password

authenticity_token这个参数可通过访问登录页面,在页面中获取,从而构建data字典完成登录。

1.9.2、代码如下
import requests
import re headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36',
'Referer': 'https://github.com/',
}
base_url = 'https://github.com/login'
request = requests.Session()
res = request.get(base_url, headers=headers).content.decode('utf-8')
data = {
'commit': 'Sign in',
'authenticity_token': re.search(r'<input type="hidden" name="authenticity_token" value="(.*?)" />', res,re.S).group(1),
'login': 'username',
'password': 'password',
} login_url = 'https://github.com/session'
res = request.post(login_url, data=data)
# with open('./1.html', 'w', encoding='utf-8') as file: #可打开这个页面,查看是否登录成功。
# file.write(res.text)
if 'username' in res.text: #也可通过关键字,查看是否登录成功。
print('login True')

二、代理

2.1、代理作用
  • 突破自身IP 访问限制, 访问一些平时不能访问的站点,比如被墙的一些国外网站,甚至是暗网。
  • 访问一些单位或团体内部资源: 比如使用教育网内地址段免费代理服务器, 就可以用于对教育网开放的各类FTP 下载上传, 以及各类资料查询共享等服务。
  • 提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区, 当有外界的信息通过时, 同时也将其保存到缓冲区中, 当其他用户再访问相同的信息时, 则直接由缓冲区中取屮信息传给用户, 以提高访问速度。
  • 隐藏真实IP : 上网者也可以通过这种方法隐藏自己的IP,减少一些麻烦。对于爬虫来说, 我们用代理就是为了隐藏自身IP , 防止自身的被封锁。
2.2、IP分类
2.2.1、按照协议
  • FTP 代理服务器:主要用于访问FTP 服务器, 一般有上传、下载以及缓存功能, 端口一般为21 、2121 等。
  • HTTP 代理服务器:主要用于访问网页, 一般有内容过滤和缓存功能, 端口一般为80 、8080 、3128 等。
  • SSL/TLS 代理:主要用于访问加密网站, 一般有SSL 或TLS加密功能, 端口一般为443 。
  • RTSP 代理:主要用于访问Real 流媒体服务器, 一般有缓存功能, 端口一般为554 。
  • Telnet 代理:主要用于telnet 远程控制( 黑客人侵计算机时常用于隐藏身份),端口一般为23
  • POP3/SMTP 代理:主要用于POP3/SMTP 方式收发邮件, 一般有缓存功能, 端口一般为110 / 25 。
  • SOCKS 代理:只是单纯传递数据包, 不关心具体协议和用法, 所以速度快很多, 一般有缓存功能, 端口一般为1080 。SOCKS 代理协议又分为SOCKS4 和SOCKS5 , 前者只支持TCP ,而后者支持TCP 和UDP , 还支持各种身份验证机制、服务器端域名解析等。简单来说,SOCKS4 能做到的SOCKS5 都可以做到, 但SOCKS5 能做到的SOCKS4 不一定能做到。
2.2.2、按照匿名程度分
  • 高匿代理: 会将数据包原封不动地转发,服务器把代理IP当作真实ip,安全性最高。数据包如下:

    • REMOTE_ADDR =代理IP
      
      HTTP_VIA = 没数值或不显示
      
      HTTP_X_FORWARDED_FOR =没数值或不显示
  • 匿名代理:服务器知道你在使用代理,但是不知道你的真实IP。数据包显示如下

    • REMOTE_ADDR =最后一个代理服务器IP
      
      HTTP_VIA = 代理服务器IP
      
      HTTP_X_FORWARDED_FOR=途经代理IP
  • 透明代理:服务器知道你在使用代理,而且也知道你的真实ip。数据包如下

    • REMOTE_ADDR =最后一个代理服务器IP
      
      HTTP_VIA = 代理服务器IP
      
      HTTP_X_FORWARDED_FOR=真实IP,途经代理IP
2.3、代理获取
  • 1、向代理服务器厂商进行购买,一般会提供接口,方便使用,效率高。
  • 2、自己从互联网上爬取,由于是免费的,所以效率低。
2.4、代理使用

我这里从西刺代理官网https://www.xicidaili.com/nn/,复制了几个。

1、非加密代理使用

import requests

proxies = {
"http": 'http://218.75.158.153:3128',
"https": "http://116.113.27.170:47849",
}
url = 'http://httpbin.org/get'
res = requests.get(url, proxies=proxies) print(res.text) {
"args": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Cache-Control": "max-age=259200",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.22.0",
"X-Amzn-Trace-Id": "Root=1-5e7c389a-3cc713099f9a75d856987e3c"
},
"origin": "218.75.158.153", #在此,我们看到了上面的代理地址
"url": "http://httpbin.org/get"
}

2、加密代理使用,与上面使用方法类似。

#我们需要加用户名与密码,格式如此
proxies = {
"http": "http://user:pass@218.75.158.153/",
}

requests模块使用二的更多相关文章

  1. Python 爬虫二 requests模块

    requests模块 Requests模块 get方法请求 整体演示一下: import requests response = requests.get("https://www.baid ...

  2. 爬虫二 requests模块的使用

    一.requests模块的介绍 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3) #注意:reques ...

  3. python网络爬虫之二requests模块

    requests http请求库 requests是基于python内置的urllib3来编写的,它比urllib更加方便,特别是在添加headers, post请求,以及cookies的设置上,处理 ...

  4. (二)requests模块

    一 requests模块 概念: python中原生的基于网络请求的模块,模拟浏览器进行请求发送,获取页面数据 安装: pip install requests 二 requests使用的步骤 1 指 ...

  5. 爬虫学习(二)requests模块的使用

    一.requests的概述 requests模块是用于发送网络请求,返回响应数据.底层实现是urllib,而且简单易用,在python2.python3中通用,能够自动帮助我们解压(gzip压缩的等) ...

  6. requests模块--python发送http请求

    requests模块 在Python内置模块(urllib.urllib2.httplib)的基础上进行了高度的封装,从而使得Pythoner更好的进行http请求,使用Requests可以轻而易举的 ...

  7. python标准模块(二)

    本文会涉及到的模块: json.pickle urllib.Requests xml.etree configparser shutil.zipfile.tarfile 1. json & p ...

  8. python爬虫之requests模块介绍

    介绍 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3) #注意:requests库发送请求将网页内容下 ...

  9. 爬虫 requests模块的其他用法 抽屉网线程池回调爬取+保存实例,gihub登陆实例

    requests模块的其他用法 #通常我们在发送请求时都需要带上请求头,请求头是将自身伪装成浏览器的关键,常见的有用的请求头如下 Host Referer #大型网站通常都会根据该参数判断请求的来源 ...

随机推荐

  1. 对Java tutorial-examples中hello2核心代码分析

    1.在hello2中有两个.java源文件分别是GreetingServlet.Java和ResponseServlet.jva文件主要对以下核心代码做主要分析. String username = ...

  2. OpenStack入门

    云计算优势 降低成本,安全稳定,易扩展. 云计算三种服务模式 IaaS:基础设施即服务 IaaS(Infrastructure-as-a- Service):基础设施即服务.消费者通过Internet ...

  3. SYC极客大挑战部分题目writeup

    Welcome 复制黏贴flag即可 我相信你正在与我相遇的路上马不停蹄 关注微信工作号回复"我要flag"即可获得flag 代号为geek的行动第一幕:毒雾初现 发现flag为摩 ...

  4. Ⅱ:python入门

    一.编程语言介绍 编程语言的分类: 机器语言 汇编语言 高级语言(编译型.解释型号) 总结: 执行效率:机器语言>汇编语言>高级语言(编译型>解释型) 开发效率:机器语言<汇编 ...

  5. 07.深入浅出 Spring Boot - 数据访问之Mybatis(附代码下载)

    MyBatis 在Spring Boot应用非常广,非常强大的一个半自动的ORM框架. 代码下载:https://github.com/Jackson0714/study-spring-boot.gi ...

  6. layer打开弹窗时传递参数(content:)

    在使用layer打开弹窗时,我希望带一些参数过去,进行某些判断.直接就可以用链接+参数的方式即可. js var userGrade=Mrant layer.open({ title: '权限管理', ...

  7. Javascript Event事件中IE与标准DOM的区别

    1.事件流的区别 <body> <div> <button>点击这里</button> </div> </body> IE采用冒 ...

  8. Feign 第一个Feign程序 一

    Feign 开源地址:https://github.com/OpenFeign/feign 1.编写接口服务 (1)导入jar包 <parent> <groupId>org.s ...

  9. php Rabbitmq扩展安装坑点

    pecl install amqp 出现 checking for amqp using pkg-config... configure: error: librabbitmq not found 这 ...

  10. springmvc 的@ResponseBody 如何使用JSONP?

    JSONP解释 在解释JSONP之前,我们需要了解下”同源策略“这个概念,这对理解跨域有帮助.基于安全的原因,浏览器是存在同源策略机制的,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载额文 ...