参考文献:https://github.com/xiantang/Spider/blob/master/Anti_Anti_Spider_521/pass_521.py

写在前面的话Python在爬虫方面的优势,想必业界无人不知,随着互联网信息时代的的发展,Python爬虫日益突出的地位越来越明显,爬虫与反爬虫愈演愈烈。下面分析一例关于返回HTTP状态码为521的案例。

  • 案例网站:【中国一带一路官网】, 以抓取文章【“一带一路”建设成果图鉴丨陆海内外联动,湖北推动产能合作纵深推进】为例,进行深度剖析。

1) 浏览器访问【“一带一路”建设成果图鉴丨陆海内外联动,湖北推动产能合作纵深推进】:

2)写ython代码访问

# coding:utf-8import requests
from fake_useragent import UserAgentUSER_AGENT = UserAgent()
ua = USER_AGENT.random
url = r'https://www.yidaiyilu.gov.cn/xwzx/gnxw/87373.htm'
headers = {"Host": "www.yidaiyilu.gov.cn","User-Agent": ua
}
rs = requests.session()
resp = rs.get(url)
print(resp.status_code)
print(resp.text)

不幸的是,返回的http的状态码却是501text为一段混淆的js代码。


3)百度查资料,推荐为文首的【参考文献】

继续参照资料修改代码,Python执行JS首选execjspip安装如下:

pip install PyExecJS

将请求到的js执行:

text_521 = ''.join(re.findall('<script>(.*?)</script>', resp.text))
func_return = text_521.replace('eval', 'return')
content = execjs.compile(func_return)
print(content.call('f'))

将返回的结果print发现还是一段JS,标准格式化(【格式化Javascript工具】),结果如下所示:

var _2i = function () {setTimeout('location.href=location.pathname+location.search.replace(/[\?|&]captcha-challenge/,\'\')', 1500);document.cookie = '__jsl_clearance=1557019601.296|0|' + (function () {var _2i = [([(-~[] << -~[])] * (((+!+{}) + [(-~[] << -~[])] >> (-~[] << -~[]))) + []), (-~{} + [] + [[]][0]) + [3 - ~(+!+{}) - ~(+!+{})], (-~{} + [] + [[]][0]) + [5], (-~{} + [] + [[]][0]) + [~~''], (-~{} + [] + [[]][0]), [-~~~!{} + [~~[]] - (-~~~!{})], (-~{} + [] + [[]][0]) + [-~{} - ~[-~{} - ~{}]], (-~{} + [] + [[]][0]) + (-~{} + [] + [[]][0]), [-~(+!+{})], (-~{} + [] + [[]][0]) + ([(-~[] << -~[])] * (((+!+{}) + [(-~[] << -~[])] >> (-~[] << -~[]))) + []), (-~{} + [] + [[]][0]) + (-~[-~{} - ~{}] + [[]][0]), (((-~[] << -~[]) << (-~[] << -~[])) + [[]][0]), [3 - ~(+!+{}) - ~(+!+{})], (-~{} + [] + [[]][0]) + (((-~[] << -~[]) << (-~[] << -~[])) + [[]][0]), [5],[-~{} - ~[-~{} - ~{}]], (-~{} + [] + [[]][0]) + [-~(+!+{})], (-~[-~{} - ~{}] + [[]][0]), [~~'']],_1d = Array(_2i.length);for (var _5 = 0; _5 < _2i.length; _5++) {_1d[_2i[_5]] = ['Bz', (-~[-~{} - ~{}] + [[]][0]), [{} + [] + [[]][0]][0].charAt(-~~~!{}), 'DR', ([(-~[] << -~[])] / (+!/!/) + [] + [[]][0]).charAt(-~[-~~~!{} - ~(-~[] - ~{} - ~{})]) + (+[(+!+{}), (+!+{})] + []).charAt((+!+{})), [[][[]] + [] + [[]][0]][0].charAt(-~{} - ~[-~{} - ~{}]), 'qM', (((-~[] << -~[]) << (-~[] << -~[])) + [[]][0]) + (+[(+!+{}), (+!+{})] + []).charAt((+!+{})) + (-~{}/~~''+[]+[[]][0]).charAt((+!/!/)),'S','g%',(((-~[]<<-~[])<<(-~[]<<-~[]))+[[]][0]),'HxXL',[[][[]]+[]+[[]][0]][0].charAt(-~{}-~[-~{}-~{}]),'D',[-~(+!+{})],'T%','YW',[{}+[]+[[]][0]][0].charAt(-~~~!{}),'vw'][_5]};return _1d.join('')})()+';Expires=Sun, 05-May-19 02:26:41 GMT;Path=/;'};if((function(){try{return !!window.addEventListener;}catch(e){return false;}})()){document.addEventListener('DOMContentLoaded ',_2i,false)}else{document.attachEvent('onreadystatechange ',_2i)}

4)修改与浏览器相关的代码,然后放入浏览器的console进行调试。

注意,在调试过程中,不难发现,js变量是动态生成的。最初还嵌套有document.createElement('div')Pythonexecjs包不支持处理这类代码,需要做相应处理。

5)综上分析,完整代码如下:

#!/usr/bin/env python
# coding:utf-8import sys
import re
import requests
import execjs
from fake_useragent import UserAgentreload(sys)
sys.setdefaultencoding('utf8')class YiDaiYiLuSpider(object):"""中国一带一路网(521反爬)"""USER_AGENT = UserAgent()ua = USER_AGENT.randomurl = r'https://www.yidaiyilu.gov.cn/xwzx/gnxw/87373.htm'headers = {"Host": "www.yidaiyilu.gov.cn","User-Agent": ua}@classmethoddef get_text521(cls):""":return:"""rs = requests.session()resp = rs.get(url=cls.url, headers=cls.headers)text_521 = ''.join(re.findall('<script>(.*?)</script>', resp.text))cookie_id = '; '.join(['='.join(item) for item in resp.cookies.items()])return cookie_id, text_521@classmethoddef generate_cookies(cls, func):""":param func::return:"""func_return = func.replace('eval', 'return')content = execjs.compile(func_return)eval_func = content.call('f')var = str(eval_func.split('=')[0]).split(' ')[1]rex = r">(.*?)</a>"rex_var = re.findall(rex, eval_func)[0]mode_func = eval_func.replace('document.cookie=', 'return ').replace(';if((function(){try{return !!window.addEventListener;}', ''). \replace("catch(e){return false;}})()){document.addEventListener('DOMContentLoaded'," + var + ",false)}", ''). \replace("else{document.attachEvent('onreadystatechange'," + var + ")}", '').\replace(r"setTimeout('location.href=location.pathname+location.search.replace(/[\?|&]captcha-challenge/,\'\')',1500);", '').\replace('return return', 'return').\replace("document.createElement('div')", '"https://www.yidaiyilu.gov.cn/"').\replace(r"{0}.innerHTML='<a href=\'/\'>{1}</a>';{0}={0}.firstChild.href;".format(var, rex_var), '')content = execjs.compile(mode_func)cookies_js = content.call(var)__jsl_clearance = cookies_js.split(';')[0]return __jsl_clearance@classmethoddef crawler(cls):""":return:"""url = r'https://www.yidaiyilu.gov.cn/zchj/sbwj/87255.htm'cookie_id, text_521 = cls.get_text521()__jsl_clearance = cls.generate_cookies(text_521)cookies = "{0};{1};".format(cookie_id, __jsl_clearance)cls.headers["Cookie"] = cookiesprint(cls.headers)res = requests.get(url=url, headers=cls.headers)res.encoding = 'utf-8'print(res.text)if __name__ == '__main__':YiDaiYiLuSpider.crawler()

运行结果如下:

【Python爬虫实例】Python解决521反爬方案相关推荐

  1. Python爬虫技巧!网站有反爬?我们有selenium!

    Selenium 是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样. 文章最后有免费的Python资料,获取方式,关注头条号,私信回复资料获取下载链 ...

  2. python 爬虫实例-python爬虫实例,一小时上手爬取淘宝评论(附代码)

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 1 明确目的 通过访问天猫的网站,先搜索对应的商品,然后爬取它的评论数据. ...

  3. Python爬虫实例,一小时上手爬取淘宝评论(附代码)!

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 1 明确目的 通过访问天猫的网站,先搜索对应的商品,然后爬取它的评论数据. ...

  4. python爬虫实例,一小时上手爬取淘宝评论(附代码)

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 1 明确目的 通过访问天猫的网站,先搜索对应的商品,然后爬取它的评论数据. ...

  5. python爬虫实例——session自动登录并爬取相关内容

    1.理解下 session (会话) 所谓的会话,你可以理解成我们用浏览器上网,到关闭浏览器的这一过程.session是会话过程中,服务器用来记录特定用户会话的信息. 比如今天双11,你淘宝网浏览了哪 ...

  6. python爬虫实例-python爬虫实例大全

    WechatSogou [1]- 微信公众号爬虫.基于搜狗微信搜索的微信公众号爬虫接口,可以扩展成基于搜狗搜索的爬虫,返回结果是列表,每一项均是公众号具体信息字典. DouBanSpider [2]- ...

  7. python爬虫实例-Python爬虫原理与python爬虫实例大全

    WechatSogou [1]- 微信公众号爬虫.基于搜狗微信搜索的微信公众号爬虫接口,可以扩展成基于搜狗搜索的爬虫,返回结果是列表,每一项均是公众号具体信息字典. DouBanSpider [2]- ...

  8. python 爬虫实例-Python 爬虫:Scrapy 实例(二)

    原标题:Python 爬虫:Scrapy 实例(二) 稍微增加点难度,做个所需项目多一点的,并将的结果以多种形式保存起来.我们就从网络天气预报开始. 首先要做的是确定网络天气数据的来源.打开百度,搜索 ...

  9. python爬虫实例电商_Python实现爬取并分析电商评论

    现如今各种APP.微信订阅号.微博.购物网站等网站都允许用户发表一些个人看法.意见.态度.评价.立场等信息.针对这些数据,我们可以利用情感分析技术对其进行分析,总结出大量的有价值信息.例如对商品评论的 ...

最新文章

  1. CNN在文本分类的应用(内有代码实现) 论文Convolutional Neural Networks for Sentence Classification
  2. python中__init__和__new__方法的使用
  3. java 扫描所有子类_java获取全部子类或接口的全部实现
  4. [LG P2519][BZOJ2298][HAOI2011]problem a
  5. 在win8下安装使用java及在win8下部署java环境变量-图文
  6. dfs文件服务器访问权限,fastDFS 文件服务器访问
  7. 5个让前端代码变得简洁的最佳实践
  8. mysql less2,实测Aurora Serverless MySQL
  9. linux vim yy,linux vim的使用方法
  10. latex---插入三线表伪代码流程图
  11. canvas小球绕斜椭圆轨迹运动
  12. 一阶线性齐次,非齐次方程的通解和解的结构定理,推导过程。
  13. spark JAVA 开发环境搭建及远程调试
  14. LeetCode——1900. 最佳运动员的比拼回合(The Earliest and Latest Rounds Where Players Compete)[困难]——分析及代码(Java)
  15. 各大平台热搜排行榜原型
  16. 管理者如何抓共性问题进行组织优化运作
  17. [2019 年百度之星·程序设计大赛 - 初赛三]简要题解?
  18. 形式主语 it 练习题
  19. 巴斯卡(Pascal)三角形Java算法
  20. 探究InnoDB数据页内部行的存储方式

热门文章

  1. 28 | MySQL读写分离之主从延迟解决方案(主从延迟问题有救了)
  2. 梳理学习Kotlin,when表达式的用法
  3. Android与.Net交互模拟用户屏幕操作添加APN和网络4G/3G切换
  4. 【Mysql】Sql分组查询后取每组的前N条记录
  5. lambda函数用法总结
  6. python的一些简单练习题
  7. 【随笔记】XR872 Codec 驱动移植和应用程序实例(附芯片调试方法)
  8. python转移路径cd_改变当前路径 (cd)
  9. 华为服务器光盘安装操作系统,服务器安装操作系统步骤
  10. linux查看僵尸进程