网页端抓数据免不了要跟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. python解析response_python:解析requests返回的response(json格式)说明

    我就废话不多说了,大家还是直接看代码吧! import requests, json r = requests.get("http://192.168.207.160:9000/api/qu ...

  2. python response.json()报错_python:解析requests返回的response(json格式)说明

    我就废话不多说了,大家还是直接看代码吧! import requests, json r = requests.get('http://192.168.207.160:9000/api/quality ...

  3. python解析response的json_python:解析requests返回的response(json格式)说明

    我就废话不多说了,大家还是直接看代码吧! import requests, json r = requests.get('http://192.168.207.160:9000/api/quality ...

  4. [转载] python解析返回结果_python:解析requests返回的response(json格式)说明

    参考链接: python-json 8: 解析requrst的响应 我就废话不多说了,大家还是直接看代码吧!jte免费资源网 import requests, json r = requests.ge ...

  5. [爬虫]请求返回521解决方法

    我需要抓取的网站是国家企业信用信息公示系统,但是该网站有反爬虫,一般的url下载方法并不适用,下面是我通过查资料后总结的一个可行的方法. 首先,要通过url和Cookie还有User-Agent去请求 ...

  6. python 爬虫返回521

    今天爬取网站返回状态码521,经过分析发现是JS混淆加密,以下是具体破解代码: import execjs import re import requests import timeurl = 'ht ...

  7. 关于Python爬取网页返回521状况码的解决方案

    文章目录 问题描述: 原因分析: 解决方案: 方法一: 方法二: 方法三: 代码一 代码二 代码三 代码四 代码五 Test代码 # 项目场景: Python3.8 问题描述: 在使用Python爬虫 ...

  8. requests 返回的cookies为空_Requests库(七)重定向和超时

    由于微信公众号推送改为了信息流的形式,防止走丢,请给加个星标 ⭐,你就可以第一时间接收到本公众号的推送! Requests库分享系列: Requests库(一) Requests库(二) Reques ...

  9. gb2312 requests乱码_不要相信requests返回的text

    本文投稿自公众号:猿人学python Python的requests库是一个非常好用的库,这应该已经是大多写过爬虫的人的共识了.它的简洁易用给我们带来很大方便.然而,它也并不是非常完美.今天我们就说说 ...

最新文章

  1. 母亲,我怎么让妳等了那么久...
  2. iOS开发之窥探UICollectionViewController(四) --一款功能强大的自定义瀑布流
  3. html2canvas在Vue项目踩坑-生成图片偏移不完整
  4. CentOs下php连mssql并配置unixODBC
  5. MFC子窗口和父窗口(SetParent,SetOwner)
  6. 发布支持多线程的PowerShell模块 —— MultiThreadTaskRunner
  7. Java程序员需要注意的五大Docker误区
  8. 如何进行普通家用无线路由器的性能测试?
  9. 打蚊子表情包_拍蚊子表情包 - 拍蚊子微信表情包 - 拍蚊子QQ表情包 - 发表情 fabiaoqing.com...
  10. 提前体验饱受期待的Windows Terminal
  11. Tajima‘s D群体遗传
  12. 必应搜索结果跳转百度
  13. 观音菩萨是企业家和领导者的好榜样
  14. PHPStorm运行PHP代码(新手教程),PHP新手入门教程
  15. 第3章 词性标注(pos、N-gram、NER等标注器)
  16. 5W无线充发射IC芯片方案XPM7105、XPM7305 无线充SOC芯片
  17. html5密码确认属性,HTML5表单及其验证【html自带属性验证】
  18. 微信小程序实现地图定位
  19. 【路径规划】FMM快速行进法船舶路径规划【含Matlab源码 2291期】
  20. html简单个人网页制作——我的家乡——四川文化(4页) HTML+CSS+JavaScript 家乡主题HTM5网页设计作业成品

热门文章

  1. APP“IP摄像头” 与OpenCV视频流读取
  2. 《新概念英语》的学习方法
  3. 音频基础知识以及PCM转WAV
  4. SEO蜘蛛精破解版 下载
  5. 黑龙江省计算机二级报名时间2021年3月,黑龙江2021年3月计算机等级考试报名时间已通知...
  6. 干货!软考中级信息系统监理师备考经验分享
  7. 史努比类库登录批量回帖
  8. Swift 2.2 的新特性
  9. An exception was thrown while activating Castle.Proxies.AppService测试AProxy -> Castle.Proxies.AppServ
  10. 语音检测心理压力状态