在知乎上看到了一个提问,大概意思是使用xpath为什么无法获取到租房价格信息。问题的链接在这里:

问题地址

看到问题,我也以为很好解决,想着很快写完答案就结束了。结果发现自己是too young too simple。要爬取的网址来自 自如租房。

开始解答这个问题,如下:

看到你这问题 本来想介绍一下xpath,结果发现自己 too young too simple。看样子自如为了反爬竟然用上了雪碧图来显示价格,而且最关键的是 这个雪碧图中数字的显示顺序是随机的,每次刷新都会换一张图。

什么是雪碧图

什么是雪碧图?简单说来就是通过把所有图片合成一张大图,然后以移位方式展示图片其中的某一部分。雪碧图的好处就不说了。而且自如用雪碧图的目的也只是为了反爬。

来具体看看雪碧图的工作原理,我们就来看下自如用来显示价格的这张雪碧图,如下:

所有的数字都合在一张图上。

价格展示

那么为了展示价格要怎么做呢,前端代码怎么写呢? HTML 部分,如下:

<p value="" class="price"><span style="background-position:1000px" class="num rmb">¥</span><span style="background-position:-240px" class="num"></span><span style="background-position:-210px" class="num"></span><span style="background-position:-150px" class="num"></span><span style="background-position:-210px" class="num"></span><span class="gray-6"> (每月)</span>
</p>
复制代码

主要是通过css设置background-position设置图片移位显示不同的数字。

说是雪碧图呢?这里没有设置图片的代码啊。接着看下CSS部分,如下:

body.ratio2 .price span.num {background-size: auto 30px;background-image: url(//static8.ziroom.com/phoenix/pc/images/price/e05092a2f84c9cca5e4d881535072ae1.png);
}
复制代码

background-image设置显示的背景图片。我们可以把其中的url截取出来,然后加上 http 的前缀,如下:

static8.ziroom.com/phoenix/pc/…

访问该地址,便会得到与开头类似的图片,如下:

注:不知道这些图片是否会被经常清理,如果查看该回答时是不能打开该图,可以去自如的网站重新查看。

那么有该图,价格怎么显示?这就是html中内嵌的css起作用了。再看显示价格的html代码:

<p value="" class="price"><span style="background-position:1000px" class="num rmb">¥</span><span style="background-position:-240px" class="num"></span><span style="background-position:-210px" class="num"></span><span style="background-position:-150px" class="num"></span><span style="background-position:-210px" class="num"></span><span class="gray-6"> (每月)</span>
</p>
复制代码

可以先来看一下,上面这段代码展示的页面是什么样子的?如下:

展示的价格是2090,然后继续看下雪碧图中数字的顺序、html代码中background-position以及css图片展示大小(30px),就可以推出,显示数字与background-position的关系是:

0px       1
-30px     7
-60px     4
-90px     3
-120px    5
-150px    9
-180px    8
-210px    0
-240px    2
-270px    6
复制代码

代码实现

如果雪碧图是固定不变的,我们就可以写出类似下面的代码 :

position_text_map = {"background-position:0px": 1,"background-position:-30px": 7,"background-position:-60px": 4,"background-position:-90px": 3,"background-position:-120px": 5,"background-position:-150px": 9,"background-position:-180px": 8,"background-position:-210px": 0,"background-position:-240px": 2,"background-position:-270px": 6
}price = 0
for span_selector in price_selector.xpath("/span[@class='num']"):position = span_selector.xpath('//div/@style')[0]price = price * 10 + position_text_map[position]
print(price)
复制代码

到此便可计算出最终价格。

随机顺序

但是,我要非常可以可惜的是一句,没这么简单,雪碧图每次都是随机生成的,所以只有网站知道每个position对应的数字是多少,而我们却无法得知。

那么,没有办法解决了吗?当然不是,此时就需要用到ocr技术了,即图片转文字。这里需要庆幸的是,价格需人眼好识别,所以没有验证码那么千奇百怪。我们可以从github找一些解决方案。

比如使用tesseract,提供了一套图片文字识别的解决方案。github如下:

tesseract-ocr/tesseract

同样我们也可以找到它对应的python封装:

sirfz/tesserocr

只要我们成功识别出了雪碧图中数字的顺序,下面的事情就很好办了。

总结

简单来说,其实就是把价格上每个数字转化图片展示。而其中用的一个重要技术就是雪碧图。通过这种方式就可以把具体的文字转化为相应的css,类似于某种加密效果。最终就实现了反爬。

转载于:https://juejin.im/post/5ced069ce51d457756536721

如何破解自如的反爬机制相关推荐

  1. 爬取拉钩 破解拉钩反爬机制

    破解拉钩反爬 实现爬取内容 拉钩的反爬很厉害 没毛病 老铁!! 我们现在来研究一下拉钩的请求头先 导入的有一个ip池(get_ip) ip池可以不写 用自己的也不会被封掉还有我是第一次写这些文章 给个 ...

  2. Python破解百度翻译反爬机制---自制翻译器

    欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答.求职一站式搞定! 对商业智能BI.大数据分析挖掘.机器学习,python,R等数据领域感兴趣的同学 ...

  3. 如何破解字体反爬机制

    这几天爬取58租房信息的时候意外发现了它是一个字体反爬的网站,所谓的字体反爬就是网站将一些关键字替换为网站自己的字体,这样在网页上字体会正常显示,但是当爬取下来的时候,经过字体加密的字符都是乱码的,根 ...

  4. 爬全景网壁纸(反爬机制Referer)

    url以及参数: https://www.quanjing.com/Handler/SearchUrl.ashx?t=1509&callback=searchresult&q=%E5% ...

  5. 关于爬虫反爬机制处理方法(整合)

    常见得反爬机制及解决办法 1.针对请求头做出得反爬 简介:网站通过去检查headers中的User-Agent字段来反爬,如果我们没有设置请求头,那么headers默认是python这样就会出现访问失 ...

  6. url中能出现的字符_python爬虫,解决大众点评字符库反爬机制的经验

    刚开始写文章还希望大家可以喜欢,对于爬虫只是个人整理出的方法,爬虫大牛请嘴下留情.""仅限学术交流,如有冒犯请联系作者删除""话不多说,想分析天津地区餐饮行业的 ...

  7. 从入门到入土:Python爬虫学习|实例练手|爬取百度翻译|Selenium出击|绕过反爬机制|

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  8. 用Nginx分流绕开Github反爬机制

    携程信息安全部 · 2016/03/10 10:30 0x00 前言 如果哪天有hacker进入到了公司内网为所欲为,你一定激动地以为这是一次蓄谋已久的APT,事实上,还有可能只是某位粗线条的员工把V ...

  9. 大众点评列表页采集思路,破解字体文件反爬(包含项目github 可用时间至2020-01-21)

    前言:最近想试试抓取大众点评数据,找了些开源代码发现基本上都用不了.自己写了一个能跑起来的项目,分享给大家,首先抓取"海底捞"店铺的列表页数据. 注意,大众点评的采集需要全程登录, ...

最新文章

  1. 开源组件ExcelReport 1.5.2 使用手册
  2. ML之FE:特征工程中的特征拼接处理(常用于横向拼接自变量特征和因变量特征)(daiding)
  3. 交互式计算机图形学总结:第一章 图形系统和模型
  4. boost::gil::extend_boundary用法的测试程序
  5. 使用 @ControllerAdvice 和 实现ResponseBodyAdvice接口, 拦截Controller方法默认返回参数,统一处理返回值/响应体
  6. 手把手教你写竞品分析
  7. JEECG 引领J2EE新开发模式插件式开发 - 公开课2013-12-12
  8. Python模拟登录的几种方法
  9. Linux下安装gcc环境
  10. Android数据库程序开发必备工具SqliteDev
  11. MODIS数据的简介和下载(一)——MODIS数据简介
  12. 十套精美个人博客网站模板
  13. 2016年四川省TI杯电子设计竞赛B题
  14. SAP案例教程CO成本会计后台配置
  15. 计算机保研面试 / 考研复试常见问题整理
  16. Python计算圆周长和面积
  17. 基于STM32使用TTP223点动触摸传感器模块
  18. 蓝牙3.0/4.0/5.0联系与区别
  19. excel中多列内容显示不全
  20. 【漫步计算机系统】:发展概览Ⅲ

热门文章

  1. 在移动设备上使用M3G编程教程(转)
  2. 【论文阅读】Recurrent Chunking Mechanisms for Long-Text Machine Reading Comprehension
  3. Jackson ImmunoResearch普通羊驼血清说明书
  4. 能测试快充真假的软件,苹果iOS 12可自行测试真假快充:山寨充电器无处遁形
  5. 抖音壁纸小程序源码最新版,支持达人入驻和多端发布
  6. 敏捷管理第三章《敏捷理解》
  7. win10系统还原失败错误0x80070091的解决方法
  8. 6.lambda表达式
  9. 如何用ChatGPT做品牌联名方案策划?
  10. win10开机显示无网络连接服务器,Win10开机无法连接网络