requests 返回 521
网页端抓数据免不了要跟JavaScript打交道,尤其是JS代码有混淆,对cookie做了手脚。找到cookie生成的地方要费一点时间。
那天碰到这样一个网页,用浏览器打开很正常。然而用requests下载URL却得到“521”的状态码,返回的内容是一串压缩混淆的JavaScript代码。就是下面这个样子:

返回的是JavaScript就好说了。肯定是浏览器运行这段JavaScript后,再次加载就可以得到真实网页内容了。
那么问题来了,这段js代码都做了些什么呢?
我们先观察一下浏览器的加载过程。因为你已经成功打开了这个网页,浏览器已经记住了某些关键的cookies,所以你要先把cookies删除。
如何删除Chrome浏览器记录的某个网站的cookies呢?
打开Chrome的settings,按这个路径寻找cookies删除的地方:Advanced -> Content Settings -> Cookies -> See all cookies and site data 。
然后在右上角的搜索栏搜索 mps.gov 就可以看到这个网站对应的cookies,把它们都删除即可。
打开浏览器的Network,选中“Preserve log”,记住加载的历史,然后用浏览器重新打开这个网址:
http://www.mps.gov.cn/n2253534/n2253535/index.html
可以看到Network记录的加载过程:

观察发现,第一次返回了521,然后停顿片刻(实际上是1.5秒,后面js代码可以看到)再次加载该网页,可以得到正确的网页内容。
对比两次请求的cookies,可以发现第二次多了些cookies。这些cookies有可能就是521时返回的js写进去的。那么我们就来研究一下这段js代码。
首先,我们需要一个js格式化的工具来帮助我们研究这段js代码。工具很多,我们使用 https://beautifier.io/ 。把代码copy到beautifier的网页格式化一下:

先来理解一下这段代码,1-16行没什么特别的。16行要eval()一段js代码字符串,这个很关键,看看它是什么。把 eval 改成 console.log,然后按F12调出Chrome的开发者工具,把全部js代码copy到 Chrome的Console运行一下:

这时候,我们可以看到控制台输出了一段js的代码,把这段代码再copy到beautifier网页格式化一下:

第4行可以看到,是给 document.cookie 赋值了,也就是给浏览器写入的一个名为 __jsl_clearance 的cookie。这个cookie的生成跟第4行最后那个 function 有关,看代码的样子,又是一段加密算法。
我们可以读懂这个function的实现用Python实现算法,但实际上这段代码太难读懂了。我们可以借助Python的 ExecJS、PyV8这样的模块来运行这段js同样也可以得到cookie的值。
有了cookie的值,我们在Python里面使用requests.Session 就可以来加载这个网页了。在Python中得到那个cookies并正确加载网页内容,是对你Python能力的考验,如果遇到什么问题可以留言讨论讨论。
时常有读者在公众号留言给我交流,多次留言比较麻烦,这里开放我微信10个朋友圈名额,可以在微信上跟我交流,只限前10个好友申请。


我的公众号:猿人学 Python 上会分享更多心得体会,敬请关注。
***版权申明:若没有特殊说明,文章皆是猿人学 yuanrenxue.com 原创,没有猿人学授权,请勿以任何形式转载。***
requests 返回 521的更多相关文章
- 取requests返回字典值用json()
		python模块requests返回值用json()["h"][key]可以取出下面的value 
- python:解析requests返回的response(json格式)
		import requests, json r = requests.get('http://192.168.207.160:9000/api/qualitygates/project_status? ... 
- requests返回页面乱码
		req=requests.post(domain,params,json=None) req=req.content.decode() 
- C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解
		前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.之前分享过一篇 C#进阶系列——WebApi接口传参不再困惑:传参详解 ... 
- WebApi 接口返回值类型详解 ( 转 )
		使用过Webapi的园友应该都知道,Webapi的接口返回值主要有四种类型 void无返回值 IHttpActionResult HttpResponseMessage 自定义类型 此篇就围绕这四块分 ... 
- WebApi接口返回值不困惑:返回值类型详解
		前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.作为程序猿,我们都知道参数和返回值是编程领域不可分割的两大块,此前分享了 ... 
- WebApi 接口返回值不困惑:返回值类型详解。IHttpActionResult、void、HttpResponseMessage、自定义类型
		首先声明,我还没有这么强大的功底,只是感觉博主写的很好,就做了一个复制,请别因为这个鄙视我,博主网址:http://www.cnblogs.com/landeanfen/p/5501487.html ... 
- (转)C#  WebApi 接口返回值不困惑:返回值类型详解
		原文地址:http://www.cnblogs.com/landeanfen/p/5501487.html 正文 前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi ... 
- requests模块学习
		- 基于如下5点展开requests模块的学习 什么是requests模块 requests模块是python中原生的基于网络请求的模块,其主要作用是用来模拟浏览器发起请求.功能强大,用法简洁高效.在 ... 
随机推荐
- 用Cygwin实现在window环境下使用Linux命令-nohup 来后台运行程序
			1.安装Cygwin 下载 cygdrive-选择64或32位 http://www.cygwin.com/ 注:可以百度搜索安装步骤 2.配置它的环境变量 添加到path路径中 3.cmd 执 ... 
- js 浮点数计算问题
			//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显.这个函数返回较为精确的加法结果. //调用:jsAdd(arg1,arg2) //返回值:arg1加上arg2的精确 ... 
- Change myself to be better
			发现和改变自己不好的习惯 遇到问题的反应 自己遇到问题的时候,特别是不熟悉的问题的时候就会有点焦虑,这个应该是每个人都会有的,遇到自己不熟悉的或者是没有经历过的东西都会 感觉不舒服,或者是遇到难题或者 ... 
- 获取Delphi焦点所在的控件及通过控件名称访问控件
			方法一: Var I: Integer; Begin For I := To ComponentCount - Do //获取组件数量 Begin If Components[I] Is TWinCo ... 
- NX二次开发-UFUN拾取平面对话框UF_UI_specify_plane
			#include <uf.h> #include <uf_ui.h> UF_initialize(); //拾取平面对话框 ] = { , , , , , , , , }; ] ... 
- python入门 集合(四)
			集合 集合是一个无序的不重复元素序列,可以迭代,也可以修改.集合迭代的时候元素是随机的. 集合通常用来 membership testing, 去重, 也可以用来求交集并集补集. 介绍一下如何创建集合 ... 
- 配置Tomcat-8.5 JVM内存参数
			配置Tomcat-8.5 JVM内存参数 apache-tomcat-8.5与之前的版本存在些许差异,配置方式有所改变,并且针对JVM一些参数不再支持.故本文档主要简介一下如何在apache-tomc ... 
- map、filter、forEach、reduce数组方法的封装
			1.map方法的封装 Array.prototype.mapAlley = function(callback){ //获取调用mapAlley这个方法的数组 let arr = thi ... 
- ps-手捧城堡滴水云雾图
			1打开背景图 置入第二张图片 栅格化-加入蒙版-渐变 置入第三张图片 栅格化-用快速选择工具选取-加入蒙版 置入第四张图片 栅格化-调整图层-点击城堡建立蒙版-点击手的蒙版 ctrl-点击城堡的蒙版- ... 
- asp.net core2.0 依赖注入 AddTransient与AddScoped的区别 - 晓剑 - CSDN博客
			原文:asp.net core2.0 依赖注入 AddTransient与AddScoped的区别 - 晓剑 - CSDN博客 原文地址:http://www.tnblog.net/aojiancc2 ... 
