大众点评网根据关键词和城市id返回搜索结果-爬虫源码示例

# -*- coding: utf-8 -*-
import requests
import re
from fontTools.ttLib import TTFont
from lxml import etree
import urllib.parse

'''获取字体文件下载连接'''
def get_woffs_url(data):
    svgtextcss = re.findall(r'href="([^"]+svgtextcss[^"]+)"', data)[0]
    woffs_url = 'http:' + svgtextcss
    woff_text = requests.get(woffs_url).text
    lines = woff_text.split('PingFangSC-')
    json_woff = {}
    for line in lines:
        woff_urls = re.findall('([^"]+woff)"\)', line)
        type = re.findall('} .(.*?){', line)
        if len(woff_urls) > 0 and len(type) > 0:
            json_woff[type[0]] = 'http:' + woff_urls[0]
    return json_woff

'''下载字体文件'''
def download(woffs_url:dict):
    for woff_name, url in woffs_url.items():
        with open('./file/woffs/{}.woff'.format(str(woff_name)), 'wb') as writer:
            writer.write(requests.get(url).content)

'''将下载得到的字体文件转换成xml文件'''
def woff_to_xml():
    font = TTFont('file/woffs/reviewTag.woff')
    font.saveXML('./file/woffs/reviewTag.xml')
    font = TTFont('file/woffs/address.woff')
    font.saveXML('./file/woffs/address.xml')
    font = TTFont('file/woffs/shopNum.woff')
    font.saveXML('./file/woffs/shopNum.xml')
    font = TTFont('file/woffs/tagName.woff')
    font.saveXML('./file/woffs/tagName.xml')

'''根据字体文件获取码表'''
def get_dict(woff_path):
    woff_dict = {'e744': '1', 'f74c': '2', 'f1a0': '3', 'f5d3': '4', 'f875': '5', 'f88d': '6', 'e7a5': '7',
    'e94d': '8', 'e357': '9', 'f47f': '0', 'f41a': '店', 'ea7c': '中', 'e0ce': '美', 'e889': '家',
    'eefe': '馆', 'f600': '小', 'e3bd': '车', 'f64d': '大', 'e973': '市', 'f86c': '公', 'e0e8': '酒',
    'efea': '行', 'f111': '国', 'f3bf': '品', 'e2ba': '发', 'f824': '电', 'f396': '金', 'f8e4': '心',
    'ed70': '业', 'e789': '商', 'e931': '司', 'e2f0': '超', 'ebf8': '生', 'efb6': '装', 'ec60': '园',
    'edbb': '场', 'e1d0': '食', 'f809': '有', 'f0bd': '新', 'e46d': '限', 'e2b2': '天', 'f79e': '面',
    'e909': '工', 'e777': '服', 'e549': '海', 'e3cd': '华', 'ead8': '水', 'f14b': '房', 'f218': '饰',
    'f76f': '城', 'edf6': '乐', 'e667': '汽', 'f76b': '香', 'e8a3': '部', 'e002': '利', 'f5ad': '子',
    'efca': '老', 'e86d': '艺', 'e945': '花', 'ef7d': '专', 'f348': '东', 'f234': '肉', 'ebcb': '菜',
    'ea88': '学', 'eed5': '福', 'ea4b': '饭', 'e90d': '人', 'f04e': '百', 'f240': '餐', 'eb25': '茶',
    'ed0e': '务', 'e2c7': '通', 'f02b': '味', 'eec8': '所', 'e3cc': '山', 'f50c': '区', 'e952': '门',
    'e9e1': '药', 'eac2': '银', 'e5fe': '农', 'f0d3': '龙', 'f28e': '停', 'f37e': '尚', 'ecd4': '安',
    'f457': '广', 'f303': '鑫', 'eea6': '一', 'ea65': '容', 'eb46': '动', 'f0bf': '南', 'ee0d': '具',
    'f5f8': '源', 'e733': '兴', 'e071': '鲜', 'f734': '记', 'eb38': '时', 'ea15': '机', 'f8ae': '烤',
    'ecf2': '文', 'e81b': '康', 'f365': '信', 'ee4a': '果', 'e687': '阳', 'f888': '理', 'f7ac': '锅',
    'f1dc': '宝', 'f5ce': '达', 'f752': '地', 'e052': '儿', 'f51d': '衣', 'f14a': '特', 'f700': '产',
    'e411': '西', 'f2fa': '批', 'f2ce': '坊', 'e191': '州', 'e561': '牛', 'eaac': '佳', 'e4fb': '化',
    'e39f': '五', 'eaa5': '米', 'f013': '修', 'e15c': '爱', 'f65c': '北', 'e215': '养', 'f58a': '卖',
    'f08d': '建', 'e676': '材', 'f71d': '三', 'e80c': '会', 'e5fb': '鸡', 'f2e6': '室', 'e866': '红',
    'e70d': '站', 'e726': '德', 'f5dd': '王', 'ef21': '光', 'f3f7': '名', 'e367': '丽', 'f3ea': '油',
    'e793': '院', 'eb2e': '堂', 'ef32': '烧', 'e8f8': '江', 'e3b4': '社', 'e3a7': '合', 'f519': '星',
    'ea3a': '货', 'e0c3': '型', 'f63a': '村', 'e308': '自', 'ebea': '科', 'f565': '快', 'f7ea': '便',
    'ec9c': '日', 'efcd': '民', 'ed56': '营', 'edb4': '和', 'e248': '活', 'f64c': '童', 'f646': '明',
    'ea96': '器', 'e386': '烟', 'edd0': '育', 'e5d1': '宾', 'e0b3': '精', 'e99a': '屋', 'e9ab': '经',
    'ee85': '居', 'f1db': '庄', 'ed51': '石', 'e426': '顺', 'f5fe': '林', 'e419': '尔', 'e06f': '县',
    'eab7': '手', 'f3b7': '厅', 'eb94': '销', 'e49f': '用', 'e4a4': '好', 'e0b0': '客', 'efe6': '火',
    'e0a9': '雅', 'f680': '盛', 'eb66': '体', 'f001': '旅', 'f0ed': '之', 'f39d': '鞋', 'e8d6': '辣',
    'ef2e': '作', 'f401': '粉', 'ef8d': '包', 'eaad': '楼', 'ee3b': '校', 'f213': '鱼', 'f5b9': '平',
    'eee9': '彩', 'e37e': '上', 'e1d1': '吧', 'f8c2': '保', 'f60e': '永', 'e58a': '万', 'e536': '物',
    'e8bb': '教', 'e90c': '吃', 'f017': '设', 'e65d': '医', 'e312': '正', 'f258': '造', 'f099': '丰',
    'f447': '健', 'eb67': '点', 'f6ac': '汤', 'e610': '网', 'e6c7': '庆', 'f1c1': '技', 'f268': '斯',
    'ea59': '洗', 'f3a0': '料', 'ed3f': '配', 'f5c8': '汇', 'e300': '木', 'f8d1': '缘', 'f0e6': '加',
    'e2dc': '麻', 'e7de': '联', 'e3f0': '卫', 'e392': '川', 'e7e8': '泰', 'ea37': '色', 'f599': '世',
    'e27d': '方', 'e900': '寓', 'e6eb': '风', 'e9ad': '幼', 'eeb1': '羊', 'ef47': '烫', 'f10b': '来',
    'f8f1': '高', 'f697': '厂', 'e5af': '兰', 'e2d2': '阿', 'efd4': '贝', 'ea44': '皮', 'ed88': '全',
    'f627': '女', 'f4e6': '拉', 'f69f': '成', 'e5c3': '云', 'f163': '维', 'f822': '贸', 'ef11': '道',
    'f3cc': '术', 'f7be': '运', 'e0fd': '都', 'e6a2': '口', 'e2ea': '博', 'e7f2': '河', 'e706': '瑞',
    'f16a': '宏', 'e8e3': '京', 'e01a': '际', 'ec0f': '路', 'f277': '祥', 'ec12': '青', 'ea05': '镇',
    'e291': '厨', 'e75a': '培', 'e9aa': '力', 'f220': '惠', 'f6da': '连', 'e5d2': '马', 'e17f': '鸿',
    'f6ec': '钢', 'e1fc': '训', 'e782': '影', 'eeb3': '甲', 'ea87': '助', 'e871': '窗', 'f505': '布',
    'f031': '富', 'ec91': '牌', 'f86a': '头', 'e808': '四', 'eed8': '多', 'e98f': '妆', 'e04e': '吉',
    'f1a3': '苑', 'e290': '沙', 'f168': '恒', 'e894': '隆', 'f375': '春', 'e629': '干', 'f232': '饼',
    'f36b': '氏', 'efcb': '里', 'e3fe': '二', 'ee4f': '管', 'e023': '诚', 'e9a2': '制', 'e2bc': '售',
    'e835': '嘉', 'e0e2': '长', 'ed37': '轩', 'f73a': '杂', 'ee96': '副', 'f747': '清', 'e6ad': '计',
    'e31d': '黄', 'f1b7': '讯', 'f4e5': '太', 'f222': '鸭', 'f6bd': '号', 'e7eb': '街', 'f87a': '交',
    'f1ae': '与', 'e846': '叉', 'e557': '附', 'e821': '近', 'f1c0': '层', 'f591': '旁', 'ea03': '对',
    'f721': '巷', 'ec0e': '栋', 'e056': '环', 'e7b1': '省', 'e284': '桥', 'e922': '湖', 'e54d': '段',
    'f738': '乡', 'f5ff': '厦', 'ef45': '府', 'ec40': '铺', 'f156': '内', 'e13a': '侧', 'ee2f': '元',
    'e84e': '购', 'e1db': '前', 'edd5': '幢', 'edbe': '滨', 'e48e': '处', 'f704': '向', 'f055': '座',
    'e753': '下', 'eda5': '臬', 'e780': '凤', 'ee1e': '港', 'e580': '开', 'eb1f': '关', 'f0c6': '景',
    'efd8': '泉', 'f4d6': '塘', 'e89b': '放', 'f141': '昌', 'eb2a': '线', 'eb88': '湾', 'f50b': '政',
    'ec76': '步', 'f7ba': '宁', 'f0e8': '解', 'e519': '白', 'f1d2': '田', 'f837': '町', 'e1be': '溪',
    'e92a': '十', 'e452': '八', 'f5cf': '古', 'ecc6': '双', 'e724': '胜', 'ee7f': '本', 'f1c8': '单',
    'f26a': '同', 'f32e': '九', 'e046': '迎', 'ee2b': '第', 'e8c9': '台', 'e0c0': '玉', 'e88a': '锦',
    'e37f': '底', 'eca0': '后', 'e3ab': '七', 'e92d': '斜', 'ec17': '期', 'e7ac': '武', 'eaee': '岭',
    'ef2b': '松', 'f352': '角', 'f51a': '纪', 'edde': '朝', 'e0dc': '峰', 'f1c6': '六', 'f491': '振',
    'f0c5': '珠', 'f319': '局', 'f063': '岗', 'e81d': '洲', 'ecfb': '横', 'ed5a': '边', 'e60c': '济',
    'f749': '井', 'f033': '办', 'f440': '汉', 'e0a0': '代', 'e205': '临', 'e7d6': '弄', 'ec59': '团',
    'e309': '外', 'e2b0': '塔', 'eca3': '杨', 'f585': '铁', 'e6f0': '浦', 'f8fc': '字', 'f289': '年',
    'e8ce': '岛', 'e45f': '陵', 'ec9a': '原', 'f6cc': '梅', 'e3aa': '进', 'f736': '荣', 'ec93': '友',
    'f27d': '虹', 'f254': '央', 'f490': '桂', 'eba9': '沿', 'f61d': '事', 'ec4c': '津', 'f482': '凯',
    'f0b1': '莲', 'e68d': '丁', 'e486': '秀', 'f32a': '柳', 'e3a1': '集', 'ef4c': '紫', 'e1a3': '旗',
    'ec10': '张', 'e7fa': '谷', 'ea38': '的', 'ed0d': '是', 'e779': '不', 'f0e4': '了', 'f4ad': '很',
    'ebdf': '还', 'f1de': '个', 'ea9e': '也', 'e898': '这', 'ed00': '我', 'eea7': '就', 'f723': '在',
    'f45e': '以', 'f3c3': '可', 'f8e3': '到', 'e136': '错', 'e8de': '没', 'e0d2': '去', 'e437': '过',
    'ec1a': '感', 'ec53': '次', 'f329': '要', 'f072': '比', 'ea6b': '觉', 'f3df': '看', 'ecc9': '得',
    'f3f3': '说', 'e369': '常', 'e99f': '真', 'e20a': '们', 'f7c6': '但', 'e8fd': '最', 'f2f8': '喜',
    'f1b6': '哈', 'e585': '么', 'f06c': '别', 'ea50': '位', 'e61b': '能', 'eab2': '较', 'f2cd': '境',
    'f6df': '非', 'f642': '为', 'e62e': '欢', 'e92e': '然', 'f89d': '他', 'e336': '挺', 'f34e': '着',
    'e5f8': '价', 'e75b': '那', 'ef3a': '意', 'e024': '种', 'e14e': '想', 'e86c': '出', 'eede': '员',
    'f74d': '两', 'f7de': '推', 'ec25': '做', 'e951': '排', 'e3dc': '实', 'e02a': '分', 'f18a': '间',
    'e7ff': '甜', 'ea54': '度', 'f025': '起', 'e6d1': '满', 'ed76': '给', 'f0b4': '热', 'e303': '完',
    'e1b9': '格', 'eda6': '荐', 'f2e1': '喝', 'e884': '等', 'e4fc': '其', 'e22e': '再', 'e1fa': '几',
    'f176': '只', 'e005': '现', 'e42c': '朋', 'e823': '候', 'e62b': '样', 'eb55': '直', 'e8da': '而',
    'e006': '买', 'ee16': '于', 'ee66': '般', 'f1f2': '豆', 'f1e6': '量', 'f5ab': '选', 'e4e0': '奶',
    'e289': '打', 'f5b7': '每', 'f7fc': '评', 'e9af': '少', 'e0b2': '算', 'e711': '又', 'e520': '因',
    'e626': '情', 'f892': '找', 'ee5a': '些', 'ede0': '份', 'e895': '置', 'ea2b': '适', 'eace': '什',
    'f1a8': '蛋', 'e77e': '师', 'eb71': '气', 'e143': '你', 'e060': '姐', 'e408': '棒', 'f810': '试',
    'e36a': '总', 'ef97': '定', 'ecd5': '啊', 'eb87': '足', 'e7ad': '级', 'e9d1': '整', 'f720': '带',
    'eee3': '虾', 'e58f': '如', 'f442': '态', 'efeb': '且', 'e479': '尝', 'ea56': '主', 'edad': '话',
    'f676': '强', 'e2c3': '当', 'ecce': '更', 'ef51': '板', 'f20b': '知', 'e54f': '己', 'e9c9': '无',
    'ead6': '酸', 'ef26': '让', 'e983': '入', 'e373': '啦', 'ec86': '式', 'f2bf': '笑', 'e168': '赞',
    'e970': '片', 'f84b': '酱', 'e7b0': '差', 'ecec': '像', 'f11a': '提', 'f1e9': '队', 'f4af': '走',
    'f21a': '嫩', 'e6b2': '才', 'e16c': '刚', 'f52d': '午', 'e628': '接', 'ec96': '重', 'e675': '串',
    'f37f': '回', 'e9b2': '晚', 'e566': '微', 'e998': '周', 'e24b': '值', 'e993': '费', 'e343': '性',
    'f86d': '桌', 'e31c': '拍', 'e351': '跟', 'f311': '块', 'f6c8': '调', 'e575': '糕'}
    font1 = TTFont(woff_path)
    uni_list = [x.replace("uni", "") for x in font1.getGlyphOrder()[2:]]
    ys_index = list(woff_dict.values())
    data = dict(zip(uni_list, ys_index))
    return data


'''点评网搜索'''
def dp_search(city_id,keywords):
    try:

        session = requests.session()
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36',
            'Cookie': 'showNav=#nav-tab|0|0; navCtgScroll=0; _lxsdk_cuid=179e55fa5a3c8-09651ed9172fa2-3323765-1fa400-179e55fa5a3c8; _hc.v=06fb0561-739c-eaf9-3dbb-e47e37ae8f04.1623050922; switchcityflashtoast=1; s_ViewType=10; uuid=2D20B43C6B114568467F8EC008E4AB0ACDA19DF606F6AC3ACE07621E7A237B99; iuuid=2D20B43C6B114568467F8EC008E4AB0ACDA19DF606F6AC3ACE07621E7A237B99; _lxsdk=2D20B43C6B114568467F8EC008E4AB0ACDA19DF606F6AC3ACE07621E7A237B99; cityid=8; _tr.u=BwLwXA7OeECrZB3G; ta.uuid=1405083339794395194; isUuidUnion=true; ll=7fd06e815b796be3df069dec7836c3df; ua=%E4%BC%9F%E5%A4%A7%E7%9A%84%E7%89%9B%E5%85%88%E7%94%9F; ctu=8c598eab76f0a44fb51e5bf9d464e88b7cb98a6781e1d3f111551d884a61d9f6; default_ab=citylist%3AA%3A1%7Cshop%3AA%3A11%7C'
        }
        url = f'https://www.dianping.com/search/keyword/{city_id}/0_{urllib.parse.quote(keywords)}'
        print(url)
        resp = session.get(url, headers=headers)
        resp.encoding = 'utf8'
        html=etree.HTML(resp.text.replace("&#x","").replace(";",""))
        li_item=html.xpath('//*[@id="shop-all-list"]/ul//li')
        download(get_woffs_url(resp.text))
        address_dict = get_dict('file/woffs/address.woff')
        shop_num_dict = get_dict('file/woffs/shopNum.woff')
        tag_name_dict = get_dict('file/woffs/tagName.woff')
        data_list=[]
        if li_item:
            for index,item  in enumerate(li_item):
                data={}
                data["title"]=title[0] if(title:=item.xpath(f'//*[@id="shop-all-list"]/ul/li[{index+1}]/div[2]/div[1]/a[1]/h4/text()')) else "-"
                shop_num=shopNum if (shopNum := item.xpath(f'//*[@id="shop-all-list"]/ul/li[{index+1}]/div[2]/div[2]/a[1]/b//text()')) else "-"
                data["shop_num"]=""
                for x in shop_num:
                    try:
                        data["shop_num"]+=shop_num_dict[x]
                    except Exception as ex:
                        data["shop_num"]+=x
                #
                data["addr"] = ""
                addr = addr if (addr := item.xpath(f'//*[@id="shop-all-list"]/ul/li[{index + 1}]/div[2]/div[3]/span//text()')) else "-"
                for x in addr:
                    try:
                        data["addr"]+=address_dict[x]
                    except Exception as ex:
                        data["addr"]+=x
                #
                data["tag_name"]=""
                tag_ame=tagName if (tagName := item.xpath(f'//*[@id="shop-all-list"]/ul/li[{index + 1}]/div[2]/div[3]/a[2]/span//text()')) else "-"
                for x in tag_ame:
                    try:
                        data["tag_name"]+=tag_name_dict[x]
                    except Exception as ex:
                        data["tag_name"]+=x
                #
                data["per_capita"]=""
                per_capita=per if (per := item.xpath(f'//*[@id="shop-all-list"]/ul/li[{index + 1}]/div[2]/div[2]/a[2]/b//text()')) else "-"
                for x in per_capita:
                    try:
                        data["per_capita"] += shop_num_dict[x]
                    except Exception as ex:
                        data["per_capita"]+=x
                data_list.append(data)
        return data_list
    except Exception as ex:
        return None


dp_search(8,"肯德基")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小牛牛先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值