转载自大众点评还不会爬?跟着我,我教你。谈谈自己跟着写这个的感想吧。
关于如何使用requests来爬取大众点评的数据。
主要分为以下2步:
- 发现数字出现的规则,css里面的规则,这一步很重要,没有找出规则,无法进行下一步
- 编码解析css,获取评论数、人均价格、口味、服务、环境评分
1.找到css
根据class值 “djaka” 对应的两个像素值,前面的是控制用哪个数字,后面的是控制用哪一段的数字集合,先记下,后面要用,同时这里的值应该是5;
打开你会发现是三行数据集合,直接看它的源码:
可以看到这里面的几个关键数字: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值