美文网首页
大众点评 评论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