大众点评 css反爬解析

本文介绍了如何使用requests模块爬取大众点评的数据,重点讲解了CSS反爬的原理和解决方法。首先,通过分析CSS找到数字显示的规则,特别是SVG文件中的字体大小和阈值。接着,解释了如何根据像素值和阈值映射从SVG文件中提取真实数据。最后,提供了详细的代码实现,帮助读者理解整个破解过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自大众点评还不会爬?跟着我,我教你。谈谈自己跟着写这个的感想吧。

关于如何使用requests来爬取大众点评的数据。

主要分为以下2步:

  1. 发现数字出现的规则,css里面的规则,这一步很重要,没有找出规则,无法进行下一步
  2. 编码解析css,获取评论数、人均价格、口味、服务、环境评分

1.找到css

根据class值 “djaka” 对应的两个像素值,前面的是控制用哪个数字,后面的是控制用哪一段的数字集合,先记下,后面要用,同时这里的值应该是5;

css样式里面有个链接:http://s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/4243e113b096a7565b58dac89255f8c2.svg

打开你会发现是三行数据集合,直接看它的源码:

可以看到这里面的几个关键数字:font-size:字体大小;还有几个y的值,我到后面才知道原来这个y是个阈值,起的是个控制的作用。

所以,这一反爬的原理就是:

获取属性值(源码中span的class值)与偏移量(源码中span的class值对应的像素值)和阈值(svg文件源码中的y值)映射,然后从svg文件中找到真数据。

现在我们就要用到上面的像素值了。

1.把所有的值取绝对值(像素值)

2.(每个span标签两个像素值)用后面的值来选择用哪个段的数字(.svg文件中有三段数字),这里的值是85,所以使用第三个段的数字集合;【三段数字,三个范围集合:0-32,33-66,67-109】

3.因为每个字体是12个像素(font-size:12px;),所以用151/12=12.58,约等于13,那么我们数一下第13个数字是啥,没错,是5,和预期一样。你可以多试验几次。【第三段数字:30321733261253610721】

以上就是整个破解的逻辑过程。

 

2.我的代码【代码里面注释的很详细】

# -*- coding:utf-8 -*-

import re
import requests
import lxml.html as H
from lxml import etree
import math


headers = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",}

'''1.获取css_url及span对应的TAG值'''
def get_tag(_list, offset=1):
    # 从第一个开始查
    _new_list = [data[0:offset] for data in _list]

    if len(set(_new_list)) == 1:
        # 如果set后只有一个值,说明全部重复,这个时候就把offset加1
        offset += 1
        return get_tag(_list, offset)
    else:
        _return_data = [data[0:offset-1] for data in _list][0]
        return _return_data

def get_css(content):
    """
    :param content:大众点评页源码内容:https://www.dianping.com/beijing/ch10/r70191
    :return:css_url:svg内容的url,多个span对应的class值
         
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值