Python爬虫入门教程 64-100 反爬教科书级别的网站-汽车之家,字体反爬之二

news/2024/5/15 23:53:43/文章来源:https://blog.csdn.net/weixin_34273046/article/details/91404732

说说这个网站

汽车之家,反爬神一般的存在,字体反爬的鼻祖网站,这个网站的开发团队,一定擅长前端吧,2019年4月19日开始写这篇博客,不保证这个代码可以存活到月底,希望后来爬虫coder,继续和汽车之间对抗。

CSDN上关于汽车之家的反爬文章千千万万了,但是爬虫就是这点有意思,这一刻写完,下一刻还能不能用就不知道了,所以可以一直不断有人写下去。希望今天的博客能帮你学会一个反爬技巧。

今天要爬去的网页

car.autohome.com.cn/config/seri… 我们要做的就是爬取汽车参数配置

具体的数据如下

查看页面源代码发现,一个好玩的事情,源代码中使用了大量的CSS3的语法 下图,我标注的部分就是关键的一些数据了,大概在600行之后。

反爬措施展示

源文件数据

刹车/<span class='hs_kw86_baikeIl'></span>安全系统
复制代码

页面显示数据

一些关键数据被处理过了。

爬取关键信息

我们要把源代码中的关键信息先获取到,即使他数据是存在反爬的。获取数据是非常简单的。通过request模块即可

def get_html():url = "https://car.autohome.com.cn/config/series/59.html#pvareaid=3454437"headers = {"User-agent": "你的浏览器UA"}with requests.get(url=url, headers=headers, timeout=3) as res:html = res.content.decode("utf-8")return html
复制代码

找关键因素

在html页面中找到关键点:

  • var config
  • var levelId
  • var keyLink
  • var bag
  • var color
  • var innerColor
  • var option

这些内容你找到之后,你下手就用重点了,他们是什么?数据啊,通过简单的正则表达式就可以获取到了

def get_detail(html):config = re.search("var config = (.*?)};", html, re.S)  option = re.search("var option = (.*?)};", html, re.S)print(config,option)
复制代码

输出结果


>python e:/python/demo.py
<re.Match object; span=(167291, 233943), match='var config = {"message":"<span class=\'hs_kw50_co>>python e:/python/demo.py
<re.Match object; span=(167291, 233943), match='var config = {"message":"<span class=\'hs_kw50_co> <re.Match object; span=(233952, 442342), match='var option = {"message":"<span class=\'hs_kw16_op>复制代码

处理汽车参数

通过正则表达式的search方法,匹配数据,然后调用group(0) 即可得到相关的数据

def get_detail(html):config = re.search("var config = (.*?)};", html, re.S)  option = re.search("var option = (.*?)};", html, re.S)# 处理汽车参数car_info = "" if config and option :car_info = car_info + config.group(0) + option.group(0)print(car_info)
复制代码

拿到数据之后,没有完,这是混淆之后的数据,需要解析回去,继续关注网页源代码,发现一段奇怪的JS。这段JS先不用管,留点印象即可~

关键字破解

注意到

<span class="hs_kw28_configfH"></span>
复制代码

hs_kw数字_configfH是一个span的class

我选中span之后的::before

对应的css为
发现实测两个字出现了,对应的class请记住

.hs_kw28_configfH::before
复制代码

全局搜索一下

双击找到来源

确定数据就在html源码当中。

格式化html源码,在内部搜索hs_kw,找到关键函数

                function $GetClassName$($index$) {return '.hs_kw' + $index$ + '_baikeCt';}
复制代码

这段JS的来源就是我们刚才保留的那个JS代码段,复制所有的JS源码,到source里面新建一个snippet,然后我们运行一下。

在里面代码最后添加一个断点,ctrl+enter运行
运行到断点,在右侧就能看到一些参数出现

  • ruleDict:
  • rulePosList
    通过参数去查找,核心的替换方法

接下来,我们进行替换操作,这部流程需要用到selenium进行替换

核心代码如下,主要的注释,我写在了代码内部,希望能帮助你看懂

def write_html(js_list,car_info):# 运行JS的DOM -- 这部破解是最麻烦的,非常耗时间~参考了互联网上的大神代码DOM = ("var rules = '2';""var document = {};""function getRules(){return rules}""document.createElement = function() {""      return {""              sheet: {""                      insertRule: function(rule, i) {""                              if (rules.length == 0) {""                                      rules = rule;""                              } else {""                                      rules = rules + '#' + rule;""                              }""                      }""              }""      }""};""document.querySelectorAll = function() {""      return {};""};""document.head = {};""document.head.appendChild = function() {};""var window = {};""window.decodeURIComponent = decodeURIComponent;")# 把JS文件写入到文件中去for item in js_list:DOM = DOM + itemhtml_type = "<html><meta http-equiv='Content-Type' content='text/html; charset=utf-8' /><head></head><body>    <script type='text/javascript'>"# 拼接成一个可以运行的网页js = html_type + DOM + " document.write(rules)</script></body></html>"    # 再次运行的时候,请把文件删除,否则无法创建同名文件,或者自行加验证即可with open("./demo.html", "w", encoding="utf-8") as f:f.write(js)# 通过selenium将数据读取出来,进行替换driver = webdriver.PhantomJS()driver.get("./demo.html")# 读取body部分text = driver.find_element_by_tag_name('body').text   # 匹配车辆参数中所有的span标签span_list = re.findall("<span(.*?)></span>", car_info)  # car_info 是我上面拼接的字符串# 按照span标签与text中的关键字进行替换for span in span_list:# 这个地方匹配的是class的名称  例如 <span class='hs_kw7_optionZl'></span> 匹配   hs_kw7_optionZl 出来info = re.search("'(.*?)'", span)if info:class_info = str(info.group(1)) + "::before { content:(.*?)}"  # 拼接为  hs_kw7_optionZl::before { content:(.*?)}             content = re.search(class_info, text).group(1)   # 匹配文字内容,返回结果为 "实测""油耗""质保"car_info = car_info.replace(str("<span class='" + info.group(1) + "'></span>"),re.search("\"(.*?)\"", content).group(1))print(car_info)
复制代码

运行结果

对比一下原来数据,发现问题不大,完成任务。

入库操作

剩下的步骤就是数据持久化了,数据拿到之后,其他的都是比较简单的,希望你可以直接搞定。

小扩展:格式化JS

碰到这种JS,直接找到格式化工具处理它

tool.oschina.net/codeformat/…

格式完成之后,代码具备一定的阅读能力

思路汇总

汽车之家用CSS隐藏了部分真实的字体,在解决的过程中,需要首先针对class去查找,当找到JS位置的时候,必须要搞定它的加密规则,顺着规则之后,只需要完成基本的key、value替换就可以拿到真实的数据了。

关注公众账号:非本科程序员

关注之后,发送【汽车】获取源码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_844024.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个python算法刷题网站刷题总结

网址如右:www.codewars.com/r/60WRWw 网站题量和牛点 这个网站里有非常多的题目,而他们的牛逼之处在于,我最精简最精简到4行解决的问题,大神都是一行代码. 更何况很多题目做下来,我并不能精简到四行. 比如有这么到题,题目是: 您住在笛卡尔市&#xff0c;那里的所有道路都以完…

Django Vue 搭建相亲网站

今天记录一个前后端分离项目,在之前开发过纯django模板语法弄出来的网页系统,也弄出来过VUE加Django混合模板的网页. django模板语法属于后端直接渲染生成的网页;vuedjango生成的则为django的url甩出html网页后,再在网页中请求后端数据,这样弄出来的稍微有些混合,因为变量请求…

微信小程序云开发静态网站h5跳小程序

官网&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/staticstorage/jump-miniprogram.html 详解&#xff1a;https://blog.csdn.net/hlc162181/article/details/113502356 最终实现

在Linux(Ubuntu16.04)上用Django框架建立网站的常用命令

Linux建站常用命令 1. 管理uwsgi&#xff1a; ps aux | grep uwsgi &#xff08;查看uwsgi进程&#xff09;uwsgi --ini uwsgi.ini &#xff08;启动uwsgi&#xff09;uwsgi --stop uwsgi.pid(关闭uwsgi进程) 2. 管理nginx&#xff08;恩金克斯&#xff09;&#xff1a; ps…

项目管理实践【五】自动编译和发布网站【Using Visual Studio with Source Control System to build and publish website autom

作者&#xff1a;Learning and Sharing--张涛的技术博客 转自&#xff1a;http://www.cnblogs.com/ttzhang/archive/2008/11/10/1330321.html 在上一篇教程项目管理实践【三】每日构建【Daily Build Using CruiseControl.NET and MSBuild】 中&#xff0c;我们讲解了如何使用C…

二级域名_高权重网站二级域名的seo实战运用

我们大家都知道&#xff0c;搜索引擎的流量是互联网上最为精准的流量之一&#xff0c;而且是用户主动搜索的流量&#xff0c;所以搜索引擎的流量要比很多其他平台获取到的流量转化率要高很多&#xff0c;因此&#xff0c;在互联网上搜索引擎的流量是在整个网络营销过程中的很重…

linux监控网站命令,Linux中的网络监控命令

监控整体的带宽使用nload命令官网下载地址&#xff1a;http://www.roland-riegel.de/nload/index.html通过YUM也可以安装yun -y install nload参数说明-t设置刷新时间间隔&#xff0c;单位为毫秒&#xff0c;默认500-i设置入站的流量图显示比例&#xff0c;默认10240-o设置出站…

USB 描述符详细解析,来自老外网站,比协议描述清晰

作者&#xff1a;header 转自&#xff1a;http://blog.csdn.net/zongguo/article/details/9322609 来自&#xff1a;http://wiki.osdev.org/Universal_Serial_Bus Universal Serial Bus The Universal Serial Bus was first introduced in 1994 with the intention of replac…

LOGO SEO 强化

前言 在某些网页中&#xff0c;为了能让浏览器更好的搜索到该网页&#xff0c;就会使用logo SEO来提权&#xff01; 代码部分 <div class"logo"><h1><a href"index.html" title"小米商城">小米商城</a></h1>&l…

如何消除网站安全的七大风险

以工作中某项目的安全改善过程为例&#xff0c;分享了常用网站安全性的典型问题和解决对策&#xff0c;希望对网站开发者有借鉴意义。 有过网站开发经验的朋友都知道网站安全是构建网站时必须要考虑的一个因素&#xff0c;网站安全的重点在于服务器的安全配置管理以及程序脚本的…

推荐一些国内外文献检索与免费下载的网站

学会尊重他人的劳动成果-转载来源https://blog.csdn.net/weixin_43795921/article/details/100169662?utm_sourceapp 点击即可打开链接&#xff1a; 1.SCI-Hub 2.CiteSeerX 3.arXiv.org 4.FINDARTICLES 5.scinapse&#xff08;用于检索比较好用&#xff0c;下载不了的在SC…

从运维角度看中大型网站架构的演变之路

一个成熟的网站架构并不是一开始设计就具备高可用、高伸缩、高性能等特性的&#xff0c;它是随着用户量和业务线不断增加&#xff0c;基础架构才逐渐健壮的。在发展初期&#xff0c;一般都是从0到1&#xff0c;不会一上来就整一些大而全的架构&#xff0c;也很少人这么任性。 …

查找会议论文的网站

http://conf.cnki.net/advanceSearch.aspx http://www.allconfs.org/list.asp

python2、python3同时存在,pip安装包后,显示No module named的问题(附加国内镜像网站)

python2、python3同时存在&#xff0c;pip安装包后&#xff0c;显示No module的问题&#xff08;附加国内镜像网站&#xff09; 在电脑中同时安装python2、python3的情况下&#xff0c;明明已经pip相对应的包后&#xff0c;但是使用import相应包时python2可以正常导入&#xf…

免费GIS数据下载网站推荐

&#xfeff;&#xfeff;数据是 GIS 的核心&#xff0c;然而你是不是还在为找不到数据而苦恼呢&#xff1f;本期我们为你挑选了国外十个免费的数据下载网站&#xff0c;赶快去看看吧&#xff01; 1、Natural Earth Data 网址&#xff1a;http://www.naturalearthdata.com/ N…

大型网站系统与JAVA中间件实践 学习总结 一

大型网站系统与JAVA中间件实践 学习总计 一前言一、用 JAVA技术和单机来构建的网站二、将单机系统设定为交易网站三、单机负载警告&#xff0c;数据库与应用分离四、应用服务器负载告警&#xff0c;如何让应用服务器走向集群访问选择问题---引入负载均衡解决session问题Session…

eyoucms网站基本信息设置

后台 — 网站首页 — 页面设置&#xff0c;即可设置。 网站基本信息是贯穿显示在整个网站上的&#xff0c;且其他SEO相关设置也会引用到&#xff0c;主要包含网站名称、关键词和网站描述等设置。 关闭网站&#xff1a;默认选择“否”&#xff0c;如果维护&#xff0c;备案或其…

eyoucms网站基本信息设置

后台 — 网站首页 — 页面设置&#xff0c;即可设置。 网站基本信息是贯穿显示在整个网站上的&#xff0c;且其他SEO相关设置也会引用到&#xff0c;主要包含网站名称、关键词和网站描述等设置。 关闭网站&#xff1a;默认选择“否”&#xff0c;如果维护&#xff0c;备案或其…

eyoucms 到底什么是网站根目录?

对于站长和互联网技术人员而言&#xff0c;网站根目录是一个很常见的概念&#xff0c;弄不明白到底哪一个目录才是根目录的新手也并不少见&#xff0c;今天益吾库就跟大家分享一下到底什么是网站根目录的相关知识。 什么是根目录 顾名思义&#xff0c;根就像树根一样&#xf…