爬虫与反爬虫的修罗场
哪种平台最吸引爬虫爱好者, 当然是社区类的, 那里容易产生原生态, 高质量的数据啊,
你看微博, 知乎, 豆瓣爬的不亦乐乎.
评论也是产生内容的好地方
生活类点评网站
旅游类点评网站
音乐类点评
只要有点评的地方, 总有成千上万的爬虫趴着.
这些都是爬虫与反爬虫的修罗场, 他不想叫你爬, 你越想爬
对他是核心数据, 对你也是核心数据
今天要分析的网站
今天我们弄一下大众点评
学习阶段, 我们要抱着学习的目的
重点是思路, 做爬虫就不要想着一劳永逸了
方法公开, 人家就换了
知识是你自己的, 学到了, 他换不掉
好了, 我们开始吧
网站展示
https://www.dianping.com/search/keyword/24/0_万达广场
what?! 数字是图片
打开 svg 图片, 看看猫腻
按照咱爬虫的经验分析
必然是 CSS 实现了图片的定位, 显示的局部
简单, 手撕代码
走起
我们如何搞定这些定位呢?
简单啊, 查找突破口
DOM 长成这个样子
- <b>
- <svgmtsi class="zrvm6">
- </svgmtsi>
- <svgmtsi class="zrpoc">
- </svgmtsi>
- </b>
zrvm6 对应的是哪个数字呢?
坐标在着
- .zrvm6 {
- background: -103.0px -116.0px;
- }
那是不是拿到所有的坐标就可以了?
必然是的
打开网页源文件
找啊~ 找啊, 找朋友
咦?
这么耿直的么?
这是在鄙视我们爬虫工程师么
还是告诉我, 此地无银
秀啊, 找到了
接下来, 敲黑板
如何从 < svgmtsi class="zrvm6"></svgmtsi > 得到数字 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
得到数字 6, 回去一看
哦, 果然是 6
666
来源: https://www.cnblogs.com/happymeng/p/10794336.html