美文网首页
大众点评 评论css加密讲解 date:2019-11-04

大众点评 评论css加密讲解 date:2019-11-04

作者: Xmaxdev | 来源:发表于2019-11-04 17:23 被阅读0次

声明:(我是个小白,学习爬虫也不久,此文章就是为了和大家沟通交流经验,非商业目的,也没有批量获取数据的意思🙏,没ip代理,没scrapy框架)没批量测试,这只是css验证的其中一个

相信很多玩爬虫的朋友,去浪评论网站的时候,大部分想到的无非就是【猫眼】、【豆瓣】、【猫途鹰】还有比较刁钻的【大众点评】
为什么说这个大众点评刁钻呢,来,先看看图吧


评论区内容是什么鬼?

之后的步骤就不用说了,百度,google,结果没一个能用的(可能都是往年的版本)
发现一个道理,有时候还是自己研究比较好,别人的不一定能用

好吧,现在我们开始分析
打开网页随便找一个全部评论
比如:http://www.dianping.com/shop/131662807/review_all

解析前所要知道什么值是关键的

F12 开始搞事情,找到一个评论中用svg现实的内容“云”,class 是 na49a
位置 是这样的

.na49a {
    background: -406.0px -1527.0px;
}

background-image 是这样的


open in new tab 打开svg文件.png
svg看到的是这样的.png

一开始我也是很懵的,我在想至于吗😂,我就是个小白啊
后来想了想还蛮有挑战性的呢就做吧,废话不对说了开始!

1.我们首先吧background 第一个数字和第二个看作x ,y
background: -406.0px -1527.0px;
2.来到 svg字体页面找到对映的子‘云’

云.png
3.看x和y值哪个和这个标签里面的比较相似,发现自己模拟的y是1527,svg的是1550,差23(其实我也不知道为什么是23,我猜是行高,反正对了😂),再试几个,发现没错 这就取到行号了
4.该看x坐标了,自己模拟的是406,发现svg里面没有对应的,于是网上搜索,发现是根据字体大小算的,发现字体大小是
font-size: 14px;
so 算法就是406/14 = 29 (index再加1 就是第30个字)

好了解析步骤就这么多,上代码,不许眨眼睛!!!

(我是把这些解析文件 都保存本地的,所以open打开的,如果想动态的话可以这段code自己改改),
必须要改的地方

1.cookie(网站上登录之后,f12,network,找Cookie)
2.request_svg_css()方法的文件路径,内容是网站的...svg.css文件


(svg_css.html).png

3.get_avg_font()方法的文件路径,内容是网站的...svg.svg文件


(svg_font.html).png
import re
import requests
from bs4 import BeautifulSoup


class Start(object):
    def __init__(self, obj):
        self.headers = {
            'referer': 'http://www.dianping.com/shop/131662807',
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',
            'Cookie': 此处请填写自己的cookie!
        }

    def main(self):
        req = requests.get(
            'http://www.dianping.com/shop/131662807/review_all'
            , headers=self.headers)
        soup = BeautifulSoup(req.text, 'html5lib')
        # text = open(
        #     '/Users/hayashishihime/Documents/PycharmProjects/outsourcing_object/大众点评-评论/comments_page.html').read()

        # soup = BeautifulSoup(text, 'html5lib')
        for inx, li in enumerate(soup.select('div.reviews-items > ul > li')):
            user_name = li.select('.name')[0].get_text(strip=True)
            user_h_img = li.select('.dper-photo-aside >img')[0].get('src')
            scores = [score.get_text(strip=True) for score in li.select('.score>.item')]
            time = li.select('.time')[0].get_text(strip=True)
            shop = li.select('.shop')[0].get_text(strip=True)
            try:
                last_review_words = \
                    re.findall(r'<div class="review-words Hide">([\s\S]*?)<div class="less-words">', str(li))[0]
            except IndexError:
                last_review_words = \
                    re.findall(r'<div class="review-words">([\s\S]*?)</div>', str(li))[0]
            print(50 * '-', inx + 1, user_name, '-' * 50)
            review_words = re.sub(r'<svgmtsi class="(.+?)"></svgmtsi>', self.request_svg_css,
                                  last_review_words).replace(' ', '')
            print(user_name)
            print(user_h_img)
            print(scores)
            print(time)
            print(shop)
            print(review_words)
            @存储可以写在这,我用的mongo 很方便

    def request_svg_css(self, css_tag):
        f = open('/Users/hayashishihime/Documents/PycharmProjects/outsourcing_object/大众点评-评论/svg_css.html', 'r').read()
        css_tag_c = re.findall(
            r'' + re.findall(r'<svgmtsi class="(.+?)"></svgmtsi>', str(css_tag))[
                0] + r'{background:-(\d+).0px -(\d+).0px;}', f)
        return self.get_avg_font(css_tag_c[0][0], css_tag_c[0][1])

    def get_avg_font(self, x, y):
        f = open('/Users/hayashishihime/Documents/PycharmProjects/outsourcing_object/大众点评-评论/svg_font.html', 'r').read()
        new_x = int((int(x) / 14))
        new_y = int(y) + 23
        font_list = re.findall(r'y="' + str(new_y) + '">(.+?)</text>', f)
        try:
            font = font_list[0][new_x:new_x + 1]
        except IndexError:
            font = ''
        return font


if __name__ == '__main__':
    start = Start('')
    start.main()

这是结果

mongo数据插入这块就不讲了

有些页面可能会用到别的svg,可以把open写成直接获取网站svg和css 动态文件,此处不赘述了

相关文章

网友评论

      本文标题:大众点评 评论css加密讲解 date:2019-11-04

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