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

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

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

    前言

    大众点评是一款非常受大众喜爱的第三方的美食相关的点评网站
    因此,该网站的数据也就非常具有价值,优惠,评价数量,好评度等数据也就非常受数据公司的欢迎。
    今天就写一个大众点评评价的数据抓取:点击跳转到采集网址

    页面解析

    页面解析.png
    从图中的红框可以看出,页面内容并不是页面返回的结果。
    <svgmtsi>标签内容的class其实是对应的class文件里的设置,对应的css实例里有链接,这个链接就是指向对应svg映射的链接。
    链接地址:http://s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/368aeaedc8cc4554b950aef63ff7daf4.svg

    页面内容

    svg链接页面内容.png
    注意上面的对比图:
    其中有个afu4l属性,这个属性是对应svg文字位置的背景图。可以自己动手修改参数值查看,对应位置汉字改变 image.png

    思路实现

    找到页面对应的css文件,解析处理内容

    对svg链接做解析处理

    import requests
    import re
    
    #对提取到的svg链接进行处理
    def svg_handle(svg_url):
        svg_req = requests.get(svg_url,verify=False)
        #print(svg_req.status_code)
        svg_req = svg_req.text
        #该正则匹配的数字的svg
        font = re.findall('" y="(\d+)">(\w+)</text>',svg_req,re.M)
        #匹配文字类
        if not font:
            font = []
            #"textLength.*?(\w+)</textPath>"
            z = re.findall('">(\w+)</textPath>', svg_req, re.M)
            y = re.findall('id="\d+" d="\w+\s(\d+)\s\w+"', svg_req, re.M)
            for a, b in zip(y, z):
                font.append((int(a), b))
        width = re.findall("font-size:(\d+)px", svg_req)[0]
        return font,int(width)
    svg_url = "//s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/368aeaedc8cc4554b950aef63ff7daf4.svg"
    f, w = svg_handle("http:" + svg_url)
    print({"font": f, "wd": w})
    

    对字体对应位置做解析

    #encoding:utf-8
    import requests
    import re
    
    
    def font_handle(ft):
        # 上一步解析svg链接得到的数据,但是多了code这个参数
        s_parser = [{'code': 'vs', 'font': [('33', '5419702638')], 'wd': 14}, {'code': 'af', 'font': [(43, '仓宜涌监章邻精课葵会入啄区月邪权栽帐八骑侵侄坚感纲姜孕蝶裤窜纺泥豆职七槐'), (81, '卸掏朋滨钥鹊疆洪算惑毁掘瞒触脂控粪垮预仔采镇恶倘过寻诸愿贺窑喜乡冻沈价石狡更力乒'), (115, '叙霞暮童话僵哀米警茧赞粒档化纷绕阅姐司饱井夺昆崖笔昼电嚷脾迅叫宪壤吃吗顿到'), (161, '镰陈脑田量钩烛没敌盗扭疫锈林快默绑炊券惧闲诉钱萍润绿殊促污诚'), (203, '盯泉悄耗押北旗煤剥诱桑悬亏畏滔插评银疼刻适摧迫兵岩艘同授艺循云涛灵探竹己努'), (243, '范债书尊伏扁搁讯驱裁组益陶贞保怀奥装填素羞率腾旷郑脱挽风饮许形勒鱼脏趁戴湖崇妄途诊'), (279, '顽羡输恰撕轿牛巡伴护建捷转陕慈驼久廉托遭倦和现竞冬嘱偶节棍埋右爸婶三地口兼痕均隆杀始'), (320, '址激苦蔬况塑陡看声公榴皂嚼美佳灌弄肤厉辞撤鸦阿瑞混卡'), (362, '缸膏筝覆都终选川棕透橘闹佩日袜烂汗疤铸投额恼轧辜论浮蔽兴策讨摩呈喇遥'), (396, '枕妈味肠衡跃骗宴进问忍折蹈泊彩铁邮鞋近壶拜凳需亲瓣励余董减虎退捆'), (442, '涨盘昌产丁响仗完净丸叛矛隶纵咬嗽复盟智徒晒词牵秆批供葱显尼艳伤惨哪付廊盖经撑随'), (478, '亮岂喉胜善资科汽费症嫌谎怜沉体缩姿桶项疲愧活欠棋锋龄健附晃玩谦巷罚芝'), (524, '违桃笛鹅靠贿昏般型跪浩炉赢办抵戚跳回嫁梦山楼冒辆煮事放蹲培淋姥肢通逃吼孩猫'), (565, '师匆蜓扮红等艇惊申负蹄面杠千而菜摔牙乖枝毒翻罐规筑糖厂杆类扑丝期菠严扣双旺轻'), (609, '吸购腊颤晨律舰迹刮工搜滴拦劣宰教琴盐笑谈籍再迷挪清雁'), (659, '歇音取最喊京哄婆宇航闭蛛糟绩捏结说魂拣墙酸察挑栗彻仪撇奋胖掠瘦夸'), (694, '偿骨常嘴犬统台议死株勿很带觉变究告膀陪帮蒙'), (730, '加枯飞票求唯留炸宫速磨疾摸假私的富不旁解构鸡挎肩帘行旅良蹦'), (765, '式芦呆俘见帜屯肾够膊被贴碎件首繁肥秩展币璃秤柜岭'), (801, '写吊志肯政抗旱踩友万命垒给酒圆肝椅暖束砖尸'), (832, '甩聪挥弹吧低拉实啦找稿渣作府惰划偷真燕喂雪它跟硬孙赌肌锐'), (866, '导订集厕堵提举衬潜于漆总狐朴侧困眼库腿梨漠酬本乘榆母慰幼重服句虾答络挖毙店讽'), (906, '帝氏俯股芽遣沾残棉姑具应研系秃猪絮忽宁蚁缴弟赖衣顺溪民亿译'), (952, '孤调焰离羊干桨短吴班任程头只寨姨必域损射岛松港圣肃搂就报色烧酷个震圈嗓厌搏方'), (986, '泄内贸诞拆望降企起诗叮厦陷鸟泻蓬着薄距后待役缓龟韵即筐挤饼亡毕倡生例娇膨仿院将斜昂'), (1026, '浊倚脉恐尺盒虑抹惭蜻逆国致寄袍龙以祖藏晋筛换样慢妻压造失款胁扯养剃炮拍暗矿泛永鹰'), (1074, '滚饿燃演怕谋煎劈宽阴闷持板买锯衰洞趴欲伸摄劫概炭军泪漂务饰葡咸苏爷烈兽晌'), (1121, '游锅惕葛鸣爹焦功雕树玉臣缎著恢剪滋秧逼柱仍柔星们苍他暑'), (1169, '裂轨卜网冠早悉温元猎引沿揪鹿木溉踢染末梳种鲜因怪车际苗无马线牢难稠'), (1205, '机汇淹顷斤躺樱高抱庙却睁颗箱五税砍足蚂旨匪酱扩沃障萌娃详九痛慧名丹修危艰纽撞贤俗谱盲'), (1245, '传呜皆胞叠席页绳蜜恭何据黄浑崭庄煌壳恨锤锄切勤楚意搭袄多售伟抄灾妥刊奶道约殿克好'), (1290, '父关段袋送场肚括深皱层你须改儿芳罗灭痒号跌拘互秋食执康晓拌掉倾耐械赠盾援蚕'), (1321, '包斑扇躁货阁南唱村刚园洽尽准丢泰勇巩僚器孟条底启蛋胡至份椒明栋大礼爽辱'), (1354, '对俱异悔杨陵伞夫安争屈皇管狂庭能砌妖梢粗阔泳榜所语武释爱景鼓除彼'), (1387, '有纹弃惠胶吓热递弊容厚亭阀副贝麦露悦史照尚占走雷脊洗悟念维与穗洁胀墓橡'), (1433, '弯储牺逐踪浴膛位窄析站伍团烦殃模甲中城珍似洒屿赵辩塌泡曲追界铺娘轰'), (1470, '定紫视凡津臂佛滥戒卧浆忆刀咐钉摇之蛇侍极熊痰扰毫削奖'), (1511, '殖固主懒森碍裹故载蕉签阵辨累平并吉春敏冲王特辅猜猴铜吩原狱腰钻材捞胃劲耳宝'), (1550, '冤篮君福置错妨怎氧搬官四丰貌责查掀纳犁贡狭羽'), (1586, '存汤目题伐几浪裕静冈扒窝广流球接燥筹涉纸得宅醒肺晚指剧驾池狗伙桥扔支尝'), (1635, '态幕播茶泽晶比卵筒添祸摊舍赴案坛悲毯冶罪伶雨蛮急'), (1669, '蓝枪达潮览宵宏击碗瓜县魔盼蒜圾摆吵炎怨贫忠丽测序营挡纯遮啊惩市遵弓理糊坊辛细渴顾'), (1712, '表她远薪返鲁塘驴疏金拨杏病幅键校迟或捐汪证湿密粘'), (1745, '抽单矮优馆册第试贩赚反披才仁碑把使漏白拼物匙慕萝厅派利当冷牌血相专手黑哲菊里'), (1789, '粱跨另势虏设懂揭心搅眨制息船训习法篇满捧守壁刺渔仙勺锁宙灯易醉淘'), (1823, '愤牲乱箩莲各贪膜杂垄叹效稍既穷坝独咏俩峰熄偏霜'), (1856, '熔棚出掩舟开替战借贱槽匹较朵竟弱哨怒舱魄纠简为请驳栏拖汁翅甚列掌身源虚恋荣'), (1898, '径泼拴毅文练鸽邀族斥缺歉孔烫抬婚承禁趋滑扫灿链差江套曾非越前推十香柳驻芒骤'), (1942, '吹录浓滤佣海正悠巨由去虫摘遗凭迈创鞠堂时宗学动乓择德古块兔奇蝴衫拥茂'), (1992, '沫青是唉审社蜂谁植东囊敲周小毛墨爬访娱享锹'), (2031, '亦凯记鸭员饭屑愉浸荷攀州料赔叶奴剑其疗柿映垫铃仅我餐盛翼育士绪绝盈'), (2076, '坦鼠笨剩宿仇骆革限伯历半立巴乳赤悼什召苹饺度浅巾年蝇认兰欺补灶麻'), (2116, '识竿境值品部决虹少鼻租状凤一吞绣塞扶遇脸百拢湾但核乎杰坡窃丑威斩拔脖新喝闯芬长陆肉'), (2163, '握背敢季止介齿乃唇攻辰穿傍仆旬挣帖螺辣岗下穴涝绞忙像估左绘'), (2199, '赛些逮寒肿检鬼阶凶幸往闻甜商叔耍全荒怠傻卖哭博聚别尾'), (2245, '倍寇馅担兆画岁向虽堪可来皮漫烘灰翁读饶删央阻边移颠堤次哥献棵姻济谢瞧嫩西舅绍织竖帆荐'), (2278, '杜予袖哗汉妹索扬叨信人候用贷上纤奸且施刷考奉若天茫狮门萄'), (2319, '础串糠茅屠碰乐述征刘落联庸沸愁呼壮蛾挺布散张知登此了也蜘垂世'), (2364, '俊矩共字罢禾驰厨稀谷蚀腥丛朱确波黎连誉操番茎两铅如观继拿莫今空斗户想搞尖财'), (2409, '赶片该废梯伪沟携询略框药未歌夏咽外帽拾坑俭受旦贯听辟超徐郎还座眠顶牧飘岸勉峡棒'), (2451, '招呀逗房宣义耽属劝窗奔秘爪雄愈乔浇零凑成唤犯斯'), (2498, '充编糕然桐恳钞隔免丙菌封诵劳缠含柄寺睡霸欢蚊桌趟粮胆归突雅孝歼碧滩裙'), (2531, '积救示女撒喘让践败妇洋销雾垃合柴厘宾治抛柏熟逢颂祝'), (2566, '配肆锻茄升点稻角乏凝舌每嫂断注侦蜡火馒技镜巧绸骡朝瞎处捡钓颜脚初乌及驶端梅垦格抢'), (2606, '届钢忧珠欧庆醋芹寸迁按土鞭粥居腹咳吨迎横依丧'), (2645, '称亩防谅踏剂拳骂医傲姓午花辫唐增男又根紧六床级袭涂嘉聋误梁倒'), (2693, '刃咱破盆愚狠誓码浙客捉避局睛基振蔑猛光桂轮舒狸纱农蠢'), (2725, '贵直符匀扛腐酿丈昨割坟沙二瓦么数运神绵斧环街典堆令水竭辽弦喷隐则先朽绢乙炒敞脆子做针'), (2767, '宋炼趣揉侮这拐膝夹贼坏渡僻跑呢软室炕隙渗性委寿思督谜液害自微稼缘那'), (2800, '渐裳惹屡鄙玻朗太叼扎禽否纪恒哈讲疯狼洲渠情'), (2841, '阳标豪乞抖雹众抓备亚雀叉兄分助辈融傅催粉刑整腔奏判挨缝堡齐忌野霉秒锦饲捎锡耕'), (2874, '坐闪路英领临铲畜暴谊抚挂颈术夕气葬消间忘筋卷家耀饥骄塔丘便'), (2912, '代允怖躲妙发臭箭计停祥围象已擦获晴戏鉴哑您锣辉眉舞碌希盏爆慌尿耻恩疑吐凉油尘蛙'), (2944, '匠协华续馋帅躬卫甘队荡验患逝谨罩御闸言侨钳者'), (2986, '薯剖打惜排衔慨图描步犹强胸老冰猾榨省烟欣尤秀敬果溜拒暂'), (3035, '淡河某赏蒸遍质勾笋郊钟杯版影岔在党住延畅疮磁稳眯截普险旧胳惯晕业绒'), (3071, '幻交参枣瓶谣慎澡歪睬旋翠收从要休夜架屋笼草群烤仰捕李挠')], 'wd': 14}, {'code': 'um', 'font': [('34', '齐赣深皇县汉光幸昆南坊曙振华六梅庆陕遵洛站五江环西年州祥辽文向街绍大通乡村利岳天山潍'), ('68', '香宾湖平徽封永鞍东府层义湛惠教合烟云路都德宁心凤育莞隆古胜主明茂北体冈太拥广衡才锦台'), ('103', '机沈谊银旗无健军家乐关津扬朝廊放浙解长春福康园武青迎宜治藏吉绵重河石结镇开肃衢晋信阳'), ('130', '佛川和甘庄襄珠蒙工化交号远兴肥汕苏锡乌九宿凰哈新黑淮保一沙常公风林爱八泉汾感成民龙黄'), ('160', '秦弄团京湾生市郑疆厦桂济波嘉临楼威中源场二昌圳人门内安头杭前肇业盐迁泰四学徐博金花设'), ('184', '谐韶邢友道定区岛木十创贵名孝海连城淄省建富夏三温尔农滨港充上澳沿七进清红鲁')], 'wd': 14}]
        for i in s_parser:
            if i["code"] in ft[0]:
                font = sorted(i["font"])
                #print(font)
                if ft[2] < int(font[0][0]):
                    # print(ft,int(font[0][0]))
                    x = int(ft[1] / i["wd"])
                    #之前按照判断条件,可以找出汉字,现在按照判断条件有些汉字找不出来,只好做个异常处理,不影响
                    try:
                        return font[0][1][x]
                    except:
                        print("获取失败")
                for j in range(len(font)):
                    if (j + 1) in range(len(font)):
                        if (ft[2] >= int(font[j][0]) and ft[2] < int(font[j + 1][0])):
                            x = int(ft[1] / i["wd"])
                            return font[j + 1][1][x]
    
    
    css_content = requests.get("http://s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/0ceda268e631d6e01c973417e1f32247.css").text
    css_list = re.findall('(\w+){background:.*?(\d+).*?px.*?(\d+).*?px;', '\n'.join(css_content.split('}')))
    css_list = [(i[0],int(i[1]),int(i[2])) for i in css_list]
    #print(css_list)
    replace_dic = []
    for i in css_list:
        replace_dic.append({"code": i[0], "word": font_handle(i)})
    print(replace_dic)
    

    解析到svgmtsi标签对应的class属性对应的字

    字体解析结果.png
    • 替换页面内容,将需要替换的文字通过属性进行替换。
    • 解析页面,获取页面需要的值。

    成果展示

    解析输出.png

    相关文章

      网友评论

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

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