【Python爬虫实例】Python解决521反爬方案
参考文献: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
的状态码却是501
,text
为一段混淆的js
代码。
3)百度查资料,推荐为文首的【参考文献】
继续参照资料修改代码,Python
执行JS
首选execjs
,pip
安装如下:
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')
,Python
的execjs
包不支持处理这类代码,需要做相应处理。
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反爬方案相关推荐
- Python爬虫技巧!网站有反爬?我们有selenium!
Selenium 是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样. 文章最后有免费的Python资料,获取方式,关注头条号,私信回复资料获取下载链 ...
- python 爬虫实例-python爬虫实例,一小时上手爬取淘宝评论(附代码)
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 1 明确目的 通过访问天猫的网站,先搜索对应的商品,然后爬取它的评论数据. ...
- Python爬虫实例,一小时上手爬取淘宝评论(附代码)!
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 1 明确目的 通过访问天猫的网站,先搜索对应的商品,然后爬取它的评论数据. ...
- python爬虫实例,一小时上手爬取淘宝评论(附代码)
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 1 明确目的 通过访问天猫的网站,先搜索对应的商品,然后爬取它的评论数据. ...
- python爬虫实例——session自动登录并爬取相关内容
1.理解下 session (会话) 所谓的会话,你可以理解成我们用浏览器上网,到关闭浏览器的这一过程.session是会话过程中,服务器用来记录特定用户会话的信息. 比如今天双11,你淘宝网浏览了哪 ...
- python爬虫实例-python爬虫实例大全
WechatSogou [1]- 微信公众号爬虫.基于搜狗微信搜索的微信公众号爬虫接口,可以扩展成基于搜狗搜索的爬虫,返回结果是列表,每一项均是公众号具体信息字典. DouBanSpider [2]- ...
- python爬虫实例-Python爬虫原理与python爬虫实例大全
WechatSogou [1]- 微信公众号爬虫.基于搜狗微信搜索的微信公众号爬虫接口,可以扩展成基于搜狗搜索的爬虫,返回结果是列表,每一项均是公众号具体信息字典. DouBanSpider [2]- ...
- python 爬虫实例-Python 爬虫:Scrapy 实例(二)
原标题:Python 爬虫:Scrapy 实例(二) 稍微增加点难度,做个所需项目多一点的,并将的结果以多种形式保存起来.我们就从网络天气预报开始. 首先要做的是确定网络天气数据的来源.打开百度,搜索 ...
- python爬虫实例电商_Python实现爬取并分析电商评论
现如今各种APP.微信订阅号.微博.购物网站等网站都允许用户发表一些个人看法.意见.态度.评价.立场等信息.针对这些数据,我们可以利用情感分析技术对其进行分析,总结出大量的有价值信息.例如对商品评论的 ...
最新文章
- CNN在文本分类的应用(内有代码实现) 论文Convolutional Neural Networks for Sentence Classification
- python中__init__和__new__方法的使用
- java 扫描所有子类_java获取全部子类或接口的全部实现
- [LG P2519][BZOJ2298][HAOI2011]problem a
- 在win8下安装使用java及在win8下部署java环境变量-图文
- dfs文件服务器访问权限,fastDFS 文件服务器访问
- 5个让前端代码变得简洁的最佳实践
- mysql less2,实测Aurora Serverless MySQL
- linux vim yy,linux vim的使用方法
- latex---插入三线表伪代码流程图
- canvas小球绕斜椭圆轨迹运动
- 一阶线性齐次,非齐次方程的通解和解的结构定理,推导过程。
- spark JAVA 开发环境搭建及远程调试
- LeetCode——1900. 最佳运动员的比拼回合(The Earliest and Latest Rounds Where Players Compete)[困难]——分析及代码(Java)
- 各大平台热搜排行榜原型
- 管理者如何抓共性问题进行组织优化运作
- [2019 年百度之星·程序设计大赛 - 初赛三]简要题解?
- 形式主语 it 练习题
- 巴斯卡(Pascal)三角形Java算法
- 探究InnoDB数据页内部行的存储方式