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中原生的基于网络请求的模块,其主要作用是用来模拟浏览器发起请求.功能强大,用法简洁高效.在 ...
随机推荐
- rsync+inotify同步备份文件
前言 rsync作用:man rsync可以看到解释为a fast, versatile, remote (and local) file-copying tool,主要进行文件的同步. inotif ...
- Centos7.5 安装sonarqube-7.1
下载sonarqube-7.1 wget -t 0 -c https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.1.z ...
- 【转载】Visual Studio + VA 常用快捷键
有过几年没怎么做window开发,发现回头再用VS忘记了好多快捷键,好记性真是不如烂笔头. 快捷键习惯设置:Tools->Options->Keyboard:Apply the follo ...
- tesserocr与pytesseract模块的使用
1.tesserocr的使用 #从文件识别图像字符 In [7]: tesserocr.file_to_text('image.png') Out[7]: 'Python3WebSpider\n\n' ...
- NOIp2018集训test-9-1(am)
1.最大值 可以用FWT水过去,李巨写了FWT结果中途爆int了炸了几十分好像. 我乱搞了一下把除了大数据有or的搞出来然后90,还是蛮划算的.我yy的做法: 1.xor 字典树上贪心, 一开始我打了 ...
- Shader实现新手指引挖空圆形和矩形
这个是参考这个做的:https://blog.csdn.net/tracyzly/article/details/80279692 Shader "UI/ImageWithHole" ...
- faster-rcnn算法总结
faster-rcnn的整体流程比较复杂,尤其是数据的预处理部分,流程比较繁琐.我写faster-rcnn系列文章的目的是对该算法的原始版本有个整体的把握,如果需要使用该算法做一些具体的任务,推荐使用 ...
- MySql 5.6重新安装后忘记密码的解决办法
1.先使用管理员权限的cmd停止MySQL服务:net stop mysql 2.重新打开一个cmd窗口进入安装目录的bin路径后输入mysqld --skip-grant-tables,注意这个cm ...
- 转: div:给div加滚动条 div的滚动条设置
div 的滚动条问题: 两种方法: 一. <div style=" overflow:scroll; width:400px; height:400px;”></div&g ...
- vue中excal表格的导入和导出
注意:vue中要实现表格的导入与导出,首先要install两个依赖, npm install -S file-saver xlsx 和 npm install -D script-loader.其 ...