网页端抓数据免不了要跟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的更多相关文章

  1. 取requests返回字典值用json()

    python模块requests返回值用json()["h"][key]可以取出下面的value

  2. python:解析requests返回的response(json格式)

    import requests, json r = requests.get('http://192.168.207.160:9000/api/qualitygates/project_status? ...

  3. requests返回页面乱码

    req=requests.post(domain,params,json=None) req=req.content.decode()

  4. C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解

    前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.之前分享过一篇 C#进阶系列——WebApi接口传参不再困惑:传参详解  ...

  5. WebApi 接口返回值类型详解 ( 转 )

    使用过Webapi的园友应该都知道,Webapi的接口返回值主要有四种类型 void无返回值 IHttpActionResult HttpResponseMessage 自定义类型 此篇就围绕这四块分 ...

  6. WebApi接口返回值不困惑:返回值类型详解

    前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.作为程序猿,我们都知道参数和返回值是编程领域不可分割的两大块,此前分享了 ...

  7. WebApi 接口返回值不困惑:返回值类型详解。IHttpActionResult、void、HttpResponseMessage、自定义类型

    首先声明,我还没有这么强大的功底,只是感觉博主写的很好,就做了一个复制,请别因为这个鄙视我,博主网址:http://www.cnblogs.com/landeanfen/p/5501487.html ...

  8. (转)C# WebApi 接口返回值不困惑:返回值类型详解

    原文地址:http://www.cnblogs.com/landeanfen/p/5501487.html 正文 前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi ...

  9. requests模块学习

    - 基于如下5点展开requests模块的学习 什么是requests模块 requests模块是python中原生的基于网络请求的模块,其主要作用是用来模拟浏览器发起请求.功能强大,用法简洁高效.在 ...

随机推荐

  1. 了解linux web的监听工具

    zabbix cacti Nagios 本想安装的,但是安装需要一个 空的服务器,因为服务器已经有安装 LAMP,故没有去了解 尝试了 cacti ,因为本地环境版本问题,只能使用0.8.8a版本,并 ...

  2. vue computed和methods 计算属性和侦听器

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. DOM——节点操作

    节点操作  var body = document.body; var div = document.createElement('div'); body.appendChild(div); ​ va ...

  4. 使用GDI+绘制的360风格按钮控件

    将下面的代码拷贝到一个单元中,创建一个包,加入这个单元后安装.使用的时候设置好背景颜色,边框颜色,图标(png格式)相对路径的文件名称.这个控件可以利用PNG图像的颜色透明特性,背景色默认透明度为50 ...

  5. [JZOJ 5810] 简单的玄学

    思路: 就是考虑一个结论 对于\(1<=x<=2^n\),那么\(x\)与\(2^n - x\)中的2的个数相等. 证明: 我们将\(x\)表示成\(2^k*b\),那么\(2^n - x ...

  6. Greenplum(PostgreSql)中函数内游标的使用实例

    直接上代码,具体整体函数定义就不上了,只写关键部分: --定义两个变量 DECLARE CCUR REFCURSOR; -- 游标变量 RECORD1 RECORD; -- 记录变量,用来存储游标遍历 ...

  7. 最常见VC++编译错误信息集合

    1.fatal error C1010: unexpected end of file while looking for precompiled header directive. 寻找预编译头文件 ...

  8. [转] 如何在vps上安装和登录Xwindows

    如何VPS也可以拥有像windows一样图形窗口,这里写个教程,据说xwindows是一个比微软windows还强大的linux图形界面,怎样强大,我也是听说的,你可以自己去试,然后告诉我. vps安 ...

  9. SPSS缺失值得分析处理

    SPSS缺失值得分析处理 在资料收集的过程中,由于各种原因可能导致数据收集不全,就会产生缺失值,且这种情况往往无法避免.如果缺失值处理不当,就会导致分析结果精度降低,出现偏倚甚至是错误的理论,因此缺失 ...

  10. python之tkinter学习目录

    前言 下面的目录结构,采用的学习视频资料是网易云课堂中[莫凡]老师的,在目录的最下面的地方给出了对应的链接! 学习是逐渐积累起来的,代码也是!下面的每一篇中的对应代码,都秉承着这样的一个理念:代码是成 ...