前言:
大众点评是一款非常受大众喜爱的第三方的美食相关的点评网站
因此,该网站的数据也就非常具有价值,优惠,评价数量,好评度等数据也就非常受数据公司的欢迎。
今天就写一个简单的大众点评列表页数据抓取
页面解析:
页面解析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"></svgmtsi><svgmtsi class="shopNum"></svgmtsi><svgmtsi class="shopNum"></svgmtsi></b>
<b>¥<svgmtsi class="shopNum"></svgmtsi><svgmtsi class="shopNum"></svgmtsi></b>
可以看出,评价数及人均消费价格被隐藏。
这种方式被称为svg映射。
接下来我们就要搞定这种类型的数据。
字体解析:
首先我们需要找到网页打开后,他们所引用的woff字体文件
在F12中进行抓包,选中Network,然后再次选中菜单栏中的Font。现在,在杂乱的网络访问内容中,就只有两个woff文件了。
下一步就是打开这个字体文件:
- 下载好目标woff文件,直接右键访问内容 ,选中"Open in new tab"就会下载这个woff文件。
- 打开https://www.fontke.com/tool/convfont这个地址,在线转换成ttf文件。
- 再打开http://fontstore.baidu.com/static/editor/index.html这个地址,在线解析刚打开的ttf文件。
-
会看到以下内容
字体解析.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