python爬取大众点评字体_python爬取大众点评解决字体反爬

今天我们弄一下大众点评

学习阶段,我们要抱着学习的目的

重点是思路,做爬虫就不要想着一劳永逸了

方法公开,人家就换了

知识是你自己的,学到了,他换不掉

好了,我们开始吧

网站展示 https://www.dianping.com/search/keyword/24/0_%E4%B8%87%E8%BE%BE%E5%B9%BF%E5%9C%BA

what?! 数字是图片

打开svg图片,看看猫腻

想要学习Python?Python学习交流群:1004391443满足你的需求,资料都已经上传群文件,可以自行下载!

按照咱爬虫的经验分析

必然是css实现了图片的定位,显示的局部

简单,手撕代码

走起

我们如何搞定这些定位呢?

简单啊,查找突破口

DOM长成这个样子

zrvm6

坐标在着 .zrvm6 { background: -103.0px -116.0px; }

那是不是拿到所有的坐标就可以了?

必然是的

打开网页源文件

找啊~找啊,找朋友

咦?

这么耿直的么?

这是在鄙视我们爬虫工程师么

还是告诉我,此地无银

秀啊,找到了

接下来,敲黑板

如何从得到数字6呢

第一步,我要打rap

额,不,我要获取css

为了加速,我写重要步骤了

你只需要这样,这样,就抓取到了

哈哈哈

重要的注释,我已经添加好了 import re import requests from lxml import html # 获取css的全部数据,并且一会通过正则表达式匹配出你想要的class # css_name 你需要获取的css名称,例如zrvm6 # css_url 'https://s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/3b0a424aef56ae40afe7711036173836.css' # 这个地方是动态的,每次都要重新抓取一下 # .tiimh{background:-456.0px -849.0px;} 编写正则表达式 def get_css_position(css_name,css_url): css_positon_html = requests.get(css_url).text str_css = (r'%s{background:-(\d+).0px -(\d+).0px' % css_name) css_re = re.compile(str_css) info_css = css_re.findall(css_positon_html) return info_css if __name__ == '__main__': a = get_css_position('tiimh','https://s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/3b0a424aef56ae40afe7711036173836.css') print(a)

展示结果,bingo,搞定 [('456', '849')]

接下来,你在这样,这样,over

坐标拿到了,下面要对应到svg里面

svg是有规律的,让我们看一下吧

横坐标,12的倍数,纵坐标分别是49,90,140,这个应该也是动态的,批量抓取的时候注意 # url需要动态获取哦~ result = requests.get('https://s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/3e7551c3d26f090c29498db5024b1090.svg') tree = html.fromstring(result.content) a = tree.xpath('//text[@y="49"]/text()')[0] # 纵坐标也是动的,需要动态 b = tree.xpath('//text[@y="90"]/text()')[0] c = tree.xpath('//text[@y="140"]/text()')[0]

补全解析过程 x,y = get_css_position('zrvm6','https://s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/3b0a424aef56ae40afe7711036173836.css')[0] x,y = int(x),int(y) print('zrvm6的坐标是',x,y) if y <= 49: print('svg图片对应的数字:',a[x // 12]) elif y <= 90: print('svg图片对应的数字:',b[x // 12]) else: print('svg图片对应的数字:',c[x // 12]) 09682953461602125891507990058105385628648915741477 54883192734856091073652293607343306967545493213422 24700621614898877713 zrvm6的坐标是 103 116 svg图片对应的数字: 6

ok,搞定了,要的就是这个feel

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值