《大众点评爬虫程序实战:爬取店铺展示信息》

这篇具有很好参考价值的文章主要介绍了《大众点评爬虫程序实战:爬取店铺展示信息》。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 一、引言 

  •  在日常生活中,我们经常会遇到一个问题:不知道吃什么。尤其是在陌生的城市或附近的地方,面对众多的餐馆选择,很难做出决策。随着互联网的发展,大众点评等餐饮评价平台应运而生,为我们提供了海量的餐馆信息和用户评价。然而,即使在这样的平台上,面对庞大的数据量,我们仍然很难迅速找到最适合我们口味的美食店

二、爬取目标

  • 采集以下数据:店名,美食类型,地点,评分,评价人数以及人均消费

三、准备工作

  • 版本:python版本3.x及以上
  • 需要用到的包:requests,selenium,re,bs4,tqdm,subprocess,time,random,bag(自写包,可私聊获取)
  • json文件:完整json文件过大,这里只截取了部分数据进行展示

    # city.json
    {
        "郑州": "https://www.dianping.com/zhengzhou",
        "珠海": "https://www.dianping.com/zhuhai",
        "张家口": "https://www.dianping.com/zhangjiakou"
    }
    
    
    # menu.json
    {
        "美食": "https://www.dianping.com/{}/ch10",
        "丽人": "https//:www.dianping.com/{}/beauty",
        "周边游": "https//:www.dianping.com/{}/ch35",
    }
    """menu.json这个文件通过后面代码自动生成,生成格式如上所示"""
    
    # cookies.json
    [{}]
    """这里涉及到隐私问题就没把cookies展示出来,
    下面会一步步带领大家如何自动获得可用的cookies
    并且保存到本地需要时直接调用"""

四、爬虫实现

  1. 使用selenium获取登录后的cookies

    @echo off
    cd "C:\Program Files\Google\Chrome\Application"
    start chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\selenium\AutomationProfile"
    #!/usr/bin/env python3
    # coding:utf-8
    import subprocess
    import bag
    import time
    import random
    
    # batch_file_content = r'''
    # @echo off
    # cd "C:\Program Files\Google\Chrome\Application"
    # start chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\selenium\AutomationProfile"
    # '''
    #
    # with open('run_chrome.bat', 'w') as f:
    #     f.write(batch_file_content)
    
    subprocess.Popen('run_chrome.bat', shell=True)
    
    web = bag.Bag.web_debug()
    
    web.get(r'https://www.dianping.com/')
    time.sleep(random.randint(5, 10))
    cookie = web.get_cookies()
    
    web.close()
    
    bag.Bag.save_json(cookie, r'./cookies.json')
    • 新建一个文本文件,将第一个代码复制过去并修改后缀为.bat文件,至于为什么要这样做呢,主要是因为这样做了后可以用subprocess来控制程序

    • 运行下面的代码一个可用的cookies便会自动生成文章来源地址https://www.toymoban.com/news/detail-857584.html

  2. 选择需要爬取的类型并生成menu.json文件

    #!/usr/bin/env python3
    # coding:utf-8
    import bag
    from bs4 import BeautifulSoup
    import re
    
    session = bag.session.create_session()
    
    for cookie in bag.Bag.read_json(r'./cookies.json'):
        session.cookies.set(cookie['name'], cookie['value'])
    
    
    # 输入需要爬取的城市名称
    def choose_city():
        js_data = bag.Bag.read_json('./city.json')
        choose = input('输入城市名:')
        judge = js_data.get(choose)  # 判断输入的城市是否存在
    
        # pattern = re.compile(r'<a.*?data-click-title="first".*?href="(.*?)".*?>(.*?)</a>', re.S)
        pattern = re.compile(r'<a.*?href="(.*?)".*?>(.*?)</a>', re.S)
    
        dic = {}
    
        if judge:
            resp = session.get(judge)
            html = BeautifulSoup(resp.text, 'lxml')
            soup = html.findAll('span', class_='span-container')
            for info in soup:
                data = re.findall(pattern, str(info))
                mid: list = data[0][0].split('/')
                mid[-2] = '{}'
                dic[data[0][1]] = 'https:' + ''.join(mid)
        else:
            print('无效输入!')
            choose_city()
        
        print(dic)   # 根据输入信息得到的生成结果
        '''输入城市名:珠海
        {
          "美食": "https:www.dianping.com{}ch10",
          "休闲娱乐": "https:www.dianping.com{}ch30",
          "结婚": "https:www.dianping.com{}wedding",
          "电影演出赛事": "https:www.dianping.com{}movie",
          "丽人": "https:www.dianping.com{}beauty",
          "酒店": "https:www.dianping.com{}hotel",
          "亲子": "https:www.dianping.com{}baby",
          "周边游": "https:www.dianping.com{}ch35",
          "运动健身": "https:www.dianping.com{}ch45",
          "购物": "https:www.dianping.com{}ch20",
          "家装": "https:www.dianping.com{}home",
          "学习培训": "https:www.dianping.com{}education",
          "生活服务": "https:www.dianping.com{}ch80",
          "医疗健康": "https:www.dianping.com{}ch85",
          "爱车": "https:www.dianping.com{}ch65",
          "宠物": "https:www.dianping.com{}ch95"
        }'''
    
        bag.Bag.save_json(dic, r'./menu.json')
    
    
    if __name__ == '__main__':
        choose_city()
    
  3. 完整代码

    # choose.py
    # !/usr/bin/env python3
    # coding:utf-8
    import bag
    
    
    def choose_city():
        session = bag.session.create_session()
    
        for cookie in bag.Bag.read_json(r'./cookies.json'):
            session.cookies.set(cookie['name'], cookie['value'])
    
        session.headers['Connection'] = 'close'
        js_data = bag.Bag.read_json('./city.json')
        choose = input('输入城市名:')
        judge = js_data.get(choose)
    
        if judge:
            city = judge.split('/')[-1]
            choose_1 = input('输入爬取类类型:')
            js_data1 = bag.Bag.read_json('./menu.json')
            judge1 = js_data1.get(choose_1)
            if judge1:
                return judge1.format(city), session
            else:
                print('开发中......')
                return None
        else:
            print('无效输入!')
            return None
    
    
    # get_shop.py
    # !/usr/bin/env python3
    # coding:utf-8
    import bag
    import chooses
    import re
    from bs4 import BeautifulSoup
    from tqdm import tqdm
    import requests
    
    
    proxies = {
         "http": "http://{}:{}",
    }
    
    
    def check():
        url_ = r'https://www.dianping.com/zhuhai/ch10'
        ip_ls = bag.Bag.read_json('../代理ip/IP地址.json')
        index = 0
        if len(ip_ls) == 0:
            print('IP地址全部失效')
            exit()
        for ip_address in ip_ls:
            proxies_ = {
                "http": "{}:{}".format(ip_address[0], ip_address[1]),
            }
            resp = session.get(url_, proxies=proxies_)
    
            if resp.status_code == 200:
                proxies['http'] = proxies['http'].format(ip_address[0], ip_address[1])  # 创建虚拟IP
                bag.Bag.save_json(ip_ls[index:], r'../代理ip/IP地址.json')
                print(f'[{index}] 更换ip成功')
                return
            index += 1
    
    
    url, session = chooses.choose_city()
    
    
    def get_types():    # 正常传参
        check()
        pattern = re.compile(r'<a.*?href="(.*?)".*?<span>(.*?)</span></a>', re.S)
        if bool(url):
            resp = session.get(url, proxies=proxies)
            html = BeautifulSoup(resp.text, 'lxml')
            soup = html.findAll('div', id='classfy')
            links = re.findall(pattern, str(soup))
            return links
        else:
            check()
            get_types()
    
    
    def get_shop():
        links = get_types()
        pattern = re.compile(r'<div class="tit">.*?<a.*?data-shopid="(.*?)".*?href="(.*?)".*?title="(.*?)"'
                             r'(?:.*?<div class="star_icon">.*?<span class="(.*?)"></span>.*?<b>(.*?)</b>)?'
                             r'(?:.*?<b>(.*?)</b>)?'
                             r'(?:.*?<div class="tag-addr">.*?<span class="tag">(.*?)</span>.*?<em class="sep">.*?<span class="tag">(.*?)</span>)?',
                             re.S)
        number = re.compile(r'data-ga-page="(.*?)"', re.S)
    
        result = []
    
        if not bool(links):
            print('获取异常')
            return
    
        for link in links:   # 获取第一页
            try:
                resp = session.get(link[0], proxies=proxies)
                page = [int(i) for i in re.findall(number, resp.text)]
                page_num = sorted(page, reverse=True)[0]
                html = BeautifulSoup(resp.text, 'lxml')
    
                soup = html.findAll('li', class_='')
                for i in soup:
                    for j in re.findall(pattern, str(i)):
                        result.append(j)
                if page_num >= 2:   # 获取第一页往后
                    for count in tqdm(range(page_num)[1:]):
                        try:
                            resp1 = session.get(link[0]+'p{}'.format(count+1), proxies=proxies)
                            html1 = BeautifulSoup(resp1.text, 'lxml')
                            soup1 = html1.findAll('li', class_='')
                            for k in soup1:
                                info = pattern.search(str(k))
                                if info:
                                    groups = list(info.groups())
                                    for i in range(len(groups)):
                                        if not groups[i]:
                                            groups[i] = 'null'
                                    result.append(tuple(groups))
                        except requests.exceptions.RequestException as e:
                            print(e)
                            check()
                        except Exception as e:
                            print(e)
                            continue
                else:
                    pass
            except requests.exceptions.RequestException as e:
                print(e)
                check()
            except Exception as e:
                print(e)
                check()
        return result
    
    
    end = get_shop()
    bag.Bag.save_excel(end, './商店.xlsx')
    

五、成品展示

六、总结

  1. 使用selenium结合requests对网页数据进行采集可以避免很多弯弯绕绕的破解
  2. 大众点评反爬机制比较完善,爬取的时候为了防止ip被拉黑建议使用代理ip,代理ip使用方法可自行百度

到了这里,关于《大众点评爬虫程序实战:爬取店铺展示信息》的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 爬虫与数据分析项目实战2.1 Selenium爬取Boss招聘信息

    完成: 1.爬取信息 2.基于爬取结果筛选符合条件的信息    岗位名称、薪资、岗位要求、地区、公司名称、公司规模、细节链接 3.筛选base杭州的岗位保存到csv文件中 But容易出现网络不稳定造成的无法定位元素所在位置的情况,小范围爬取可以 4.基于csv分析后续

    2024年02月08日
    浏览(44)
  • ins视频批量下载,instagram批量爬取视频信息【爬虫实战课1】

    Instagram 是目前最热门的社交媒体平台之一,拥有大量优质的视频内容。但是要逐一下载这些视频往往非常耗时。在这篇文章中,我们将介绍如何使用 Python 编写一个脚本,来实现 Instagram 视频的批量下载和信息爬取。 我们使用selenium获取目标用户的 HTML 源代码,并将其保存在本地

    2024年04月23日
    浏览(52)
  • 【Python爬虫开发实战②】使用urllib以及jsonpath爬取即将上映电影信息

    🚀 个人主页 :为梦而生~ 关注我一起学习吧! 💡 专栏 :python网络爬虫从基础到实战 欢迎订阅!后面的内容会越来越有意思~ 💡 往期推荐 : ⭐️首先,我们前面讲了多篇基础内容: 【Python爬虫开发基础④】爬虫原理 【Python爬虫开发基础⑤】HTML概述与基本标签详解 【P

    2024年02月12日
    浏览(46)
  • 爬虫之牛刀小试(十):爬取某宝手机商品的销量,价格和店铺

    首先淘宝需要登录,这一点如果用selenium如何解决,只能手动登录?如果不用selenium,用cookies登录也可。但是验证码又是一个问题,现在的验证码五花八门,难以处理。 我们回到正题,假设你已经登录上淘宝了,接着我们需要找到输入框和搜索按钮,输入“手机”,点击搜索

    2024年04月10日
    浏览(60)
  • 大众点评评论采集软件使用教程

    导出字段: 店铺ID 评论ID 发布时间 人均消费 评分 详情链接 点赞数 浏览数 评论数 最后更新时间 发布平台 推荐 评论详情 原始评论 图片数 图片链接 用户等级 用户名称 用户头像 VIP 私

    2024年01月16日
    浏览(45)
  • JS逆向之大众点评mtgsig

    本教程仅限于学术探讨,也没有专门针对某个网站而编写,禁止用于非法用途、商业活动、恶意滥用技术等,否则后果自负。观看则同意此约定。如有侵权,请告知删除,谢谢! 目录 前言 一、先分析下接口参数 二、开导mtgsig 1.找加密入口 2.扣算法 3.验证算法 最近了工作也

    2024年02月08日
    浏览(78)
  • 仿大众点评项目 —— Day01【短信登录、商户查询缓存】

    ❤ 作者主页:欢迎来到我的技术博客😎 ❀ 个人介绍:大家好,本人热衷于 Java后端开发 ,欢迎来交流学习哦!( ̄▽ ̄)~* 🍊 如果文章对您有帮助,记得 关注 、 点赞 、 收藏 、 评论 ⭐️⭐️⭐️ 📣 您的支持将是我创作的动力,让我们一起加油进步吧!!!🎉🎉 1.1 基

    2024年02月13日
    浏览(40)
  • 使用影刀采集大众点评数据:打造自动化数据采集工具

    在本教程中,我将向大家介绍如何使用影刀(YinDao)来采集大众点评的数据。影刀是一款强大的自动化流程处理工具,可以帮助我们自动执行网页操作、数据提取等任务,极大地提高了数据采集的效率和准确性。通过本教程,你将学会如何使用影刀来构建一个自动化的数据采

    2024年04月17日
    浏览(52)
  • python爬虫爬取top250中排名、评分、导演等展示可视化界面

    源代码+4千字报告     需要源代码+数据库+可视化+数据+4千字报告加我qq    

    2024年02月13日
    浏览(38)
  • 【Python爬虫实战】汽车城最好的十款车,第一名竟是这款车...Python教你一键采集二手车数据信息实现数据可视化展示哦~(附视频教程)

    驾考不易,天天早起去练车,无论烈日还是下雨,通通都在室外进行,但想要拿证,一定要坚 持不懈的去练车。 粉丝白嫖源码福利,请移步至CSDN社区或文末公众hao即可免费。 小编就是在一复一日的练习中,终于得到了我人生中以为不可能考证之驾照到手了! 这不?驾照到

    2024年02月02日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包