爬虫前期知识补充

cookie与session

cookie与session的发明是专门用来解决http协议无状态的特点

 

http协议无状态>>>>:不保存用户端状态(记不住)

早期的网址不需要保存用户状态 所有人来访问都是爱你沟通的数据

随着是道德发展越来越多的网址需要保存用户状态(记住)

 

cookie:保存在客户端浏览器上的键值对数据

用户第一次登录成功之后 浏览器会保存用户名和密码

之后访问该网站都会自动带着用户名和密码

 

 

 

 

session:保存在服务端上面的用户相关数据

用户第一次登陆成功之后 服务端会返回给客户一个随机字符创(也可能是多个)

客户端浏览器保存该随机字符串之后访问网站都会带着这个随机字符串

 

 

 

cookie和session到底是什么关系

session需要依赖cookie

 

只要是涉及到用户登录都需要使用到cookie

浏览器也可以拒绝保存数据(下图为谷歌浏览器)

 

 

 

cookie实践例子(花花手机网站)

浏览器network选项中 请求体对应的关键字是Form Data

登录地址:http://www.aa7a.cn/user.php

请求体数据格式:

username: 616564099@qq.com
password: 123123
captcha: jv3d
remember: 1
ref: http://www.aa7a.cn/user.php?act=logout
act: act_login

写爬虫代码一定要先试用浏览器研究其规律 再写出代码

 

 

 

思路:

1.研究登录数据提交给后端的URL地址

2.研究登录post请求携带的请求体数据格式

3.模拟发送post请求

import requests


res = requests.post('http://www.aa7a.cn/user.php',
                    data={
                        "username": "616564099@qq.com",
                        "password": "lqz123",
                        "captcha": "kuyb",
                        "remember": 1,
                        "ref": "http://www.aa7a.cn/user.php?act=logout",
                        "act": "act_login"
                    }   data参数携带请求体数据
                    )
 获取cookie数据 print(res.cookies.get_dict())
user_cookie = res.cookies.get_dict()

 

 

用户名或密码错误的情况下返回的cookie数据
{'ECS[visit_times]': '1', 
'ECS_ID': '69763617dc5ff442c6ab713eb37a470886669dc2'}

 

 

用户名和密码都正确的情况下返回的cookie数据
{
    'ECS[password]': '4a5e6ce9d1aba9de9b31abdf303bbdc2', 
    'ECS[user_id]': '61399', 
    'ECS[username]': '616564099%40qq.com', 
    'ECS[visit_times]': '1', 
    'ECS_ID': 'e18e2394d710197019304ce69b184d8969be0fbd'
    }

 

 

 

 

 使用cookie访问网站
res1 = requests.get('http://www.aa7a.cn/',
                    cookies=user_cookie
                    )
if '616564099@qq.com' in res1.text:
    print('登录身份访问')
else:
    print('cookie存在错误')

 

 

获取大数据

stream参数:一点一点的取

比如下载一个大约100G的视频 使用response.content然后一下子全部写入文件中是不合理的

import requests
response=requests.get('https://www.shiping.com/xxx.mp4',
                      stream=True)
with open('b.mp4','wb') as f:
    for line in response.iter_content():   一行一行读取内容
        f.write(line)

 

 

 

json格式

json格式的数据具有非常明显的特征:双引号

 

在网络爬虫的领域 内部的很多数据都是采用json格式

前后端数据的交互一般采用的是json格式

import requests
res = requests.get
('https://api.bilibili.com/x/player/pagelist?bvid=BV1QE41147hU&jsonp=jsonp') print(res.json()) 可以直接将json格式字符串转换成python对应的数据类型

 

 

SSL相关的报错(苹果电脑常见)

 百度上一搜全都有

 

IP代理池

有很多的网站对客户端的IP地址也存在防爬措施

例子:比如在一分钟内同一个IP地址访问该网站的次数不能超过30次 超过了就封禁该IP地址

 

针对该防爬措施如何解决?

需要用到IP代理池

里面有很多的IP地址每次访问从中随机挑选出一个

 

代理设置:先发送请求给代理,然后由代理帮忙发送(就算IP被封也是很正常的事情)

import requests
proxies={
    'http':'114.99.223.131:8888', 协议是http IP地址和端口号用冒号连接
    'http':'119.7.145.201:8080',
    'http':'175.155.142.28:8080',
}
respone=requests.get('https://www.12306.cn',  需要访问的网站
                     proxies=proxies)

 

 

 

cookie代理池

很多网站针对客户端的cookie也存在防爬措施

例子:一分钟之内同一个cookie访问该网站的次数不能超过某个次数超过了就封禁该cookie

针对该防爬措施如何解决

使用cookie代理池

里面有很多的cookie每次访问的时候从里面拿出来一个使用(前期需要准备很多的cookie才能使用)

respone=requests.get('https://www.12306.cn',  #需要访问的网站
                     cookies={}) #输入准备好的cookie

 

浏览器功能介绍

Elements     查看页面被浏览器渲染之后的html代码
Console    相对于一个JavaScript编写环境
Sources    以文件目录的形式存放各种资源
Network    监控网络请求
       Fetch/XHR
Application  数据存储相关
       Cookies

防爬措施及解决策略

1.User-Agent
requests.get(url,headers={})
2.IP代理池
requests.get(url,proxies={})
3.Cookie代理池
requests.get(url,cookies={})

requests参数总结

 1.url
请求地址


 2.params
get请求携带的数据


 3.headers
请求头数据


 4.data
post请求携带的数据(请求体)

 

posted @ 2021-09-16 15:01  ふじわらたくみ  阅读(85)  评论(0)    收藏  举报