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

爬虫与反爬虫的修罗场

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

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

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

生活类点评网站

旅游类点评网站

音乐类点评

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

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

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

今天要分析的网站

今天我们弄一下大众点评

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

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

方法公开,人家就换了

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

好了,我们开始吧

网站展示

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

Python爬虫入门教程 65-100 爬虫与反爬虫的修罗场,点评网站,字体反爬之三_第1张图片
what?! 数字是图片

Python爬虫入门教程 65-100 爬虫与反爬虫的修罗场,点评网站,字体反爬之三_第2张图片
Python爬虫入门教程 65-100 爬虫与反爬虫的修罗场,点评网站,字体反爬之三_第3张图片
打开svg图片,看看猫腻

Python爬虫入门教程 65-100 爬虫与反爬虫的修罗场,点评网站,字体反爬之三_第4张图片
按照咱爬虫的经验分析

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

简单,手撕代码

走起

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

Python爬虫入门教程 65-100 爬虫与反爬虫的修罗场,点评网站,字体反爬之三_第5张图片
简单啊,查找突破口

DOM长成这个样子




zrvm6 对应的是哪个数字呢?

坐标在着

.zrvm6 {
    background: -103.0px -116.0px;
}

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

必然是的

Python爬虫入门教程 65-100 爬虫与反爬虫的修罗场,点评网站,字体反爬之三_第6张图片
打开网页源文件

找啊~找啊,找朋友

咦?

Python爬虫入门教程 65-100 爬虫与反爬虫的修罗场,点评网站,字体反爬之三_第7张图片
这么耿直的么?
这是在鄙视我们爬虫工程师么
还是告诉我,此地无银

Python爬虫入门教程 65-100 爬虫与反爬虫的修罗场,点评网站,字体反爬之三_第8张图片
秀啊,找到了

接下来,敲黑板

如何从得到数字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

Python爬虫入门教程 65-100 爬虫与反爬虫的修罗场,点评网站,字体反爬之三_第9张图片
坐标拿到了,下面要对应到svg里面
svg是有规律的,让我们看一下吧

Python爬虫入门教程 65-100 爬虫与反爬虫的修罗场,点评网站,字体反爬之三_第10张图片
横坐标,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

Python爬虫入门教程 65-100 爬虫与反爬虫的修罗场,点评网站,字体反爬之三_第11张图片
欢迎关注「非本科程序员」 回复 【点评】获取本篇博客源码

你可能感兴趣的:(Python爬虫入门教程 65-100 爬虫与反爬虫的修罗场,点评网站,字体反爬之三)