cookies应对python反爬虫知识点详解


Posted in Python onNovember 25, 2020

在保持合理的数据采集上,使用python爬虫也并不是一件坏事情,因为在信息的交流上加快了流通的频率。今天小编为大家带来了一个稍微复杂一点的应对反爬虫的方法,那就是我们自己构造cookies。在开始正式的构造之前,我们先进行简单的分析如果不构造cookies爬虫时会出现的一些情况,相信这样更能体会出cookies的作用。

网站需要cookies才能正常返回,但是该网站的cookies过期很快,我总不能用浏览器开发者工具获取cookies,然后让程序跑一会儿,每隔几分钟再手动获取cookies,再让程序继续跑吧。如果反复这样工作,那么写爬虫也就没意义了。便开始对cookies进行分析。

从浏览器的开发者工具获取到的cookies大约有10个字段,经过反复测试,能让网站正常返回的只需要两个字段,分别为__jsluid_h=011a522dbxxxxxxxxc1ce59d336e5e60和__jsl_clearance=1581880640.794|0|trTB4c6b%2BZpvxxxxxxxx8YqCOOo%3D (中间打码处理)。

 经过测试,如果请求的时候不自己构造cookies,默认会返回__jsluid_h :

cookies应对python反爬虫知识点详解

先尝试了将那段js脚本保存下来,包装成一个html文件打开,发现浏览器不停的刷新,也并没起什么作用。那就分析一下js脚本,原来的代码是单行的,自己整理一下并加了一些变量名和log,大概是这么个样子: 

cookies应对python反爬虫知识点详解

将第16行的变量cmd打印出来看看,发现是另一段类似的脚本:

cookies应对python反爬虫知识点详解

可以看到第二段脚本已经开始设置cookies的__jsl_clearence 字段了。这些显然就是混淆后的js脚本,但是分析到这里也就大概弄明白了从发送请求到网站返回是怎么回事。之所以在本地跑这段代码会不断刷新,是因为第二行的setTimeout会让其在1.5秒后重新请求,但是我们本地没有服务处理请求让其停止,所以会不断的刷新。

而第一段脚本当中,变量y是完整的js代码 ,代码中的变量名和关键字被进行编码了,变量x存储的是用来替换的变量名和关键字,后面是解码函数。所以现在的问题变成了获取第一段脚本当中的cmd代码,执行后再获取第二段代码的document.cookie的内容即可。

可是对于python和js的交互我完全没接触过,尝试了PyExecJS和Js2Py,都没办法正常执行第一段脚本。无奈之下,我用python复现了第一段脚本,然后用Js2Py获取了cookie。在请求一次过后,构造cookies,再请求一次,就可以了:

def test():
  url = REQUEST_URL
  # url = 'https://www.baidu.com'
  request_header = get_header()
  html = requests.get(url, headers=request_header)
  print(html)
  jscode = html.text
  # print(jscode)
  # tryjs.get_cookies()为复现的js代码,以及用Js2Py获取cookies的代码
  request_cookies = try_js.get_cookies(jscode)
  request_cookies += ';__jsluid_h=' + html.cookies['__jsluid_h']
  request_header['Cookie'] = request_cookies
  print(request_header)
  html = requests.get(url, headers=request_header, timeout=5)
  print('new connection')
  print(html)
  print(html.text)

在经历重重的分析试验后,我们终于得出以上的代码成功实现了构造cookies。相信经过本篇的学习,小伙伴们又多了一种解决爬虫阻拦获取数据的cookies办法了,赶快行动起来吧。

到此这篇关于cookies应对python反爬虫知识点详解的文章就介绍到这了,更多相关如何构造cookies应对python反爬虫内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
深入Python解释器理解Python中的字节码
Apr 01 Python
Python正则表达式实现截取成对括号的方法
Jan 06 Python
python操作mysql数据库
Mar 05 Python
Django自定义插件实现网站登录验证码功能
Apr 19 Python
django 中的聚合函数,分组函数,F 查询,Q查询
Jul 25 Python
对Django中static(静态)文件详解以及{% static %}标签的使用方法
Jul 28 Python
python中树与树的表示知识点总结
Sep 14 Python
深入浅析Python 中的sklearn模型选择
Oct 12 Python
用Python去除图像的黑色或白色背景实例
Dec 12 Python
详解python命令提示符窗口下如何运行python脚本
Sep 11 Python
Python Tkinter实例——模拟掷骰子
Oct 24 Python
利用Python发送邮件或发带附件的邮件
Nov 12 Python
Python基于unittest实现测试用例执行
Nov 25 #Python
python反爬虫方法的优缺点分析
Nov 25 #Python
Pytest测试框架基本使用方法详解
Nov 25 #Python
python实现企业微信定时发送文本消息的实例代码
Nov 25 #Python
Python json解析库jsonpath原理及使用示例
Nov 25 #Python
搭建pypi私有仓库实现过程详解
Nov 25 #Python
Python代码覆盖率统计工具coverage.py用法详解
Nov 25 #Python
You might like
聊天室php&mysql(三)
2006/10/09 PHP
很实用的一个完整email发送程序
2006/10/09 PHP
封装一个PDO数据库操作类代码
2009/09/09 PHP
PHP处理excel cvs表格的方法实例介绍
2013/05/13 PHP
解析csv数据导入mysql的方法
2013/07/01 PHP
PHP禁止个别IP访问网站
2013/10/30 PHP
删除html标签得到纯文本可处理嵌套的标签
2014/04/28 PHP
PHP中的Streams详细介绍
2014/11/12 PHP
PHP实现在线阅读PDF文件的方法
2015/06/17 PHP
PHP浮点比较大小的方法
2016/02/14 PHP
jQuery图片轮播滚动切换代码分享
2020/04/20 Javascript
angular2使用简单介绍
2016/03/01 Javascript
15款最好的Bootstrap在线编辑器
2016/08/03 Javascript
nodejs个人博客开发第五步 分配数据
2017/04/12 NodeJs
js排序与重组的实例讲解
2017/08/28 Javascript
vue 挂载路由到头部导航的方法
2017/11/13 Javascript
详解JavaScript中typeof与instanceof用法
2018/10/24 Javascript
使用react render props实现倒计时的示例代码
2018/12/06 Javascript
jquery无缝图片轮播组件封装
2020/11/25 jQuery
js使用文件流下载csv文件的实现方法
2019/07/15 Javascript
JS内置对象和Math对象知识点详解
2020/04/03 Javascript
Python制作数据导入导出工具
2015/07/31 Python
Python3.5实现的罗马数字转换成整数功能示例
2019/02/25 Python
linux 下python多线程递归复制文件夹及文件夹中的文件
2020/01/02 Python
Python3 mmap内存映射文件示例解析
2020/03/23 Python
Python Mock模块原理及使用方法详解
2020/07/07 Python
Python实现打包成库供别的模块调用
2020/07/13 Python
Python监听键盘和鼠标事件的示例代码
2020/11/18 Python
HTML5 video循环播放多个视频的方法步骤
2020/08/06 HTML / CSS
全球500多个机场的接送服务:Suntransfers
2019/06/03 全球购物
路由表示做什么用的?在linux环境中怎么来配置一条默认路由?
2013/06/07 面试题
实习教师自我鉴定
2013/09/27 职场文书
企业党建工作总结2015
2015/05/26 职场文书
MongoDB数据库的安装步骤
2021/06/18 MongoDB
Go语言grpc和protobuf
2022/04/13 Golang
关于pytest结合csv模块实现csv格式的数据驱动问题
2022/05/30 Python