Python爬虫入门教程 65-100 爬虫与反爬虫的修罗场,点评网站,字体反爬之三

爬虫与反爬虫的修罗场

哪种平台最吸引爬虫爱好者,当然是社区类的,那里容易产生原生态,高质量的数据啊,

你看微博,知乎,豆瓣爬的不亦乐乎。

评论也是产生内容的好地方

生活类点评网站

旅游类点评网站

音乐类点评

只要有点评的地方,总有成千上万的爬虫趴着。

这些都是爬虫与反爬虫的修罗场,他不想叫你爬,你越想爬

对他是核心数据,对你也是核心数据

今天要分析的网站

今天我们弄一下大众点评

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

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

方法公开,人家就换了

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

好了,我们开始吧

网站展示

在这里插入图片描述
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

在这里插入图片描述
欢迎关注「非本科程序员」 回复 【点评】获取本篇博客源码

posted @ 2019-04-30 09:51  梦想橡皮擦  阅读(6675)  评论(7编辑  收藏  举报