美文网首页Python
python 采集大众点评(数字反爬)

python 采集大众点评(数字反爬)

作者: 乂尤先生 | 来源:发表于2020-10-12 18:02 被阅读0次

前言:

大众点评是一款非常受大众喜爱的第三方的美食相关的点评网站
因此,该网站的数据也就非常具有价值,优惠,评价数量,好评度等数据也就非常受数据公司的欢迎。
今天就写一个简单的大众点评列表页数据抓取

页面解析:

页面解析01.png

从图中可以看到对应的评价数字都是方框,所以对这些要进行一下分析
先做一个简单的采集处理,查看一下控制台输出的内容,以及直接在网页中查看源代码


控制台输出.png
网页源代码.png

可以看到一下两种内容

{'店铺': '夏氏砂锅(万松园店)', '评分': '4.79', '评价数': '1\ueeed\uf119\uf7c4\uf40d', '人均消费': '¥\uf796\uf796', '菜系': '\ue39f\ue7d0\ue307 \ue64e\uf4af\uf3cd', '地址': '雪\uf861\ueadb73\uf1b3', '口味': '\ueeed.\uf7961', '环境': '\ueeed.\ue7dd\uf2d4', '服务': '\ueeed.\ue411\uf7c4'}
<b>1<svgmtsi class="shopNum">&#xe2ca;</svgmtsi><svgmtsi class="shopNum">&#xe2ca;</svgmtsi><svgmtsi class="shopNum">&#xf5a0;</svgmtsi></b>
<b>¥<svgmtsi class="shopNum">&#xe9c5;</svgmtsi><svgmtsi class="shopNum">&#xf5a0;</svgmtsi></b>

可以看出,评价数及人均消费价格被隐藏。
这种方式被称为svg映射。
接下来我们就要搞定这种类型的数据。

字体解析:

首先我们需要找到网页打开后,他们所引用的woff字体文件
在F12中进行抓包,选中Network,然后再次选中菜单栏中的Font。现在,在杂乱的网络访问内容中,就只有两个woff文件了。
下一步就是打开这个字体文件:

字体解析.png
  • 查看字形,进行分析
    • 通过观察,我们看到在百度字体解析的文字代码中,都是以“unie”开头的,那么我们将之前看到的编码内容组合后进入字体文件中搜索,就可以验证该编码是否正确对应网页显示的数字了

构造映射字典

从刚才的页面解析中,我们已经明白了“\uf119”是0,“\uf796”是7,那么咱们再次在页面中找到其他的相关数字,【0-9】十个数字很容易就组合出来了。记住,1不需要重构

self.woff = {
          "\uf119": "0",
          # "": "1",
          "\uf40d": "2",
          "\uf2d4": "3",
          "\ueeed": "4",
          "\ue411": "5",
          "\ue7dd": "6",
          "\uf7c4": "7",
          "\uf796": "8",
          "\ue41e": "9",
      }

注意:字体svg经常改变,需要自己对应当时的情况写一下

解析处理数据

import requests
from pyquery import PyQuery as pq

def get_session():
    req = requests.Session()
    #添加请求头
    req.headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"
    }
    return req

def get_num(uncode_list):
    #构造字体映射字典
    woff = {
        "\uf119": "0",
        # "": "1",
        "\uf40d": "2",
        "\uf2d4": "3",
        "\ueeed": "4",
        "\ue411": "5",
        "\ue7dd": "6",
        "\uf7c4": "7",
        "\uf796": "8",
        "\ue41e": "9",
    }
    count = ""
    for uncs in uncode_list:
        if uncs in woff.keys():
            cc = woff[uncs]
        else:
            cc = uncs
        count += cc
    return count


def get_html(res):
    info = {}
    #pyquery 解析
    content = pq(res.text)
    content = content("div #shop-all-list ul li").items()
    for doc in content:
        info["店铺"] = doc("div .tit a h4").text()
        info["评分"] = doc("div .nebula_star ").text()
        review_num = doc("div.comment a.review-num b").text().replace("\n","")
        info["评价数"] = get_num(review_num)
        price = doc("div.comment a.mean-price b").text().replace("\n","")
        info["人均消费"] = get_num(price)
        #info["菜系"] = doc("div.tag-addr span.tag").text().replace("\n","")
        #info["地址"] = doc("span.addr").text().replace("\n","")
        flavor = doc("span.comment-list span:nth-child(1) b").text().replace("\n","")
        info["口味"] = get_num(flavor)
        environment = doc("span.comment-list span:nth-child(2) b").text().replace("\n", "")
        info["环境"] = get_num(environment)
        service = doc("span.comment-list span:nth-child(3) b").text().replace("\n", "")
        info["服务"] = get_num(service)
        print(info)

if __name__ == '__main__':
    url = "http://www.dianping.com/wuhan/ch10"
    req = get_session()
    res = req.get(url)
    get_html(res)

解析结果

解析结果.png

相关文章

网友评论

    本文标题:python 采集大众点评(数字反爬)

    本文链接:https://www.haomeiwen.com/subject/eknupktx.html