当前位置: 首页 > news >正文

python爬虫--cookie、防盗链、代理

处理cookie

1.cookie就是在浏览器登录页面的时候,你把你的的账号和密码输入,主机会接受到你的用户名和密码,然后校验正确性,如果用户名和密码正确,主机会向你的浏览器里面的cookie里面写入一串代码,以后你如果再次向服务器发送请求就会带着这个cookie去访问主机。

在我们学的之前的爬取的三大方法里面,我们抓取的都是可视化的,即你可以找到你想爬取的内容,但是当我们碰到需要用户登录的时候,会出现一点问题。比如一些页面在登录以后,你需要爬取里面“我的”的内容,像”你的浏览“、“你保存的东西”,这样爬取需要两步:第一步就是登录得到cookie。第二步就是带着cookie去请求url。我们要是直接用requests请求去爬取里面的数据,会显示用户信息错误i,这样的话有两个解决方案:第一就是用session进行请求,这样的话cookie就不会消失 第二就是可以在requests中直接加入cookie 。

1.用session请求cookie

我们这里以17k小说网为例,拿到17k小说中“我的书架”中的内容。我们主要就是要拿到这个访问的url ,我们在登录之后,在检查页面找到login这个目录,login里面的url就是我们要去请求的url

 当我们第一次拿到我们想要请求的这个url之后,我们要到“我的书架”拿到我们想要的东西,这时候如果用requests进行请求的话,会开始一个新的请求。我们刚才拿到的cookie就会消失,所以用session请求将两个步骤连起来。用session请求“我的书架”上的数据也是一样的,在检查页面找到“我的书架”里面的内容,访问url就可以了

import requests

session = requests.session()
data = {
    'loginName': '11111',
    'p——w': ''
}

#1.登录
url = 'https://passport.17k.com/ck/user/login'
session.post(url,data=data)
#2.拿到书架上的数据
session.get("https://user.17k.com/ck/author/shelf?page=1&appKey=2406394919")

2.在requests请求中直接加入cookie

之前说过,如果我们直接用requests去请求“我的书架”的内容 就会出现这样的问题

 这样我们就需要在我们请求的url里面找到一长串的cookie 然后复制粘贴进去

 

防盗链

我们这里以抓取梨视频为例子,在我们抓取梨视频的时候,在检查页面可以定位到视频本身是video这个标签,但是在页面源代码中并没有任何显示任何video标签,这样用爬虫爬取视频的时候就定位不到

这样有一个问题,我们在检查页面中的开发者工具和页面源代码是有偏差的。检查页面中的开发者工具显示的是实时的页面数据,里面可以找到这个video标签

我们通过开发者工具定位到视频我们就会找到这个视频本身的url,但是我们复制粘贴访问是什么也没有的,这时候我们就要对比页面源代码那个<video>标签中的url和我们在开发者工具中的url。 

 

 我们发现前面都是一样的,一直到20170314后面的内容不一样,而后面不一样的内容就是上面可以找到的systemTime。呢我们在爬取的时候只需要将中间的内容替换就可以拿到了。我们就需要以下几步

#拿到contid
#拿到video_status返回的srcurl
#对srcurl中的内容进行修正
#拿到视频真正的下载路径进行下载
import requests
url = 'https://www.pearvideo.com/video_1047268'
contid = url.split("_")[1]
video_status = f"https://www.pearvideo.com/videoStatus.jsp?contId={contid}&mrd=0.22973357777189096"
resp = requests.get(video_status)
print(resp.text)

但是我们做到这一步,我们根本拿不到里面的内容,里面会显示,这就是一个防盗链的问题

我们通常会加上开发者工具页面的refer,这就是一个防盗链,可以认为就是一个溯源,即本次请求的上一级是谁。我去查了一下他的专业解释和目的

                                                           图像来自@studyphp123

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36',
    'Referer': 'https://www.pearvideo.com/video_1047268'
}

这样加上溯源就可以解决防盗链的问题

最后我们要把我们想要的srcurl解析出来 就得从这一串json中定位,找到srcurl将它切出来

并且还需要systemtIme 同样的方法拿出来,之后进行位置交换,最后写入文件就可以了

dic = resp.json()
srcUrl = dic['videoInfo']['videos']['srcUrl']
systemTime = dic['systemTime']
srcUrl = srcUrl.replace(systemTime,f'cont-{contid}')
# print(srcUrl)
with open("7.1day",mode='wb') as f:
    f.write(requests.get(srcUrl).content)

代理

加入你想拿到大量的数据去访问一个网站,你一秒钟访问了很多次,网站就会对你封锁ip 这时候就会用到代理。但代理也算是一个黑色地带,不建议大家使用

原理:通过第三方机器去发送请求

首先可以在网上搜索到一些免费的代理,然后找到ip和端口,跟之前加上headers一样加上一个pories就可以实现代理

porxies = {
    "https" : "https://47.101.41.163:8080" ,

}
resp = requests.get("https://baidu.com",proxies=proxies)

相关文章:

  • Vue3+TSX开发模式下内置组件的替代方案
  • 燃烧化学平衡判据
  • 05--Django视图层-JsonResponse对象、request对象中的其他方法以及FBV与CBV的书写
  • Spring中Bean的生命周期详解
  • Linux文件之/etc/passwd和/etc/shadow
  • OCR - 微软windows 11系统自带的Windows OCR功能初体验
  • 公众号网课查题系统
  • 关于SELECT...FOR UPDATE到底锁表还是锁行
  • 解决问题的思路很重要,运维领域,结果对,过程就对!
  • C++ 顺序表和单链表的二路归并思想(详解+示例代码)
  • T1071 菲波那契数(信息学一本通C++)
  • Android开发基础——广播实践
  • opencv 深度学习
  • Windows取证——基本网络命令
  • CDH 09Cloudera Manager Kerberos安装配置(markdown新版二)
  • 【comparator, comparable】小总结
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • flutter的key在widget list的作用以及必要性
  • Java知识点总结(JavaIO-打印流)
  • JS基础之数据类型、对象、原型、原型链、继承
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Node + FFmpeg 实现Canvas动画导出视频
  • webpack+react项目初体验——记录我的webpack环境配置
  • 分类模型——Logistics Regression
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 前端路由实现-history
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 跳前端坑前,先看看这个!!
  • 听说你叫Java(二)–Servlet请求
  • 终端用户监控:真实用户监控还是模拟监控?
  • 大数据全解:定义、价值及挑战
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​如何在iOS手机上查看应用日志
  • ​一些不规范的GTID使用场景
  • ​用户画像从0到100的构建思路
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (九十四)函数和二维数组
  • (数据结构)顺序表的定义
  • (算法)N皇后问题
  • .bashrc在哪里,alias妙用
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .net打印*三角形
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • @Pointcut 使用
  • @SentinelResource详解
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce
  • [120_移动开发Android]008_android开发之Pull操作xml文件
  • [④ADRV902x]: Digital Filter Configuration(发射端)
  • [Angular] 笔记 6:ngStyle