Python中如何获取大众点评商铺的位置信息

DianPing

由于想要将自己平时收藏的店铺做个整理,需要解析获取到上图右侧部分的地图标签,然后从图片 url 里提取坐标的经纬度信息。但是使用 requests 解析不到网页右侧一列的部分;使用 Puppeteer 并设置 Header+Cookie 只能获取到一个 html 裸页面,结果如下图

Puppeteer Test

代码参考 https://gist.github.com/huyinjie/bd1733be239ed69352acd7aa33b05dfa


Python中如何获取大众点评商铺的位置信息

9 回复

关注。。。我之前只爬了地名,没拿准确经纬度。我本来是打算拿百度 API 查地址的经纬度的。。。


要获取大众点评商铺的位置信息,最直接的方法是使用其官方API。不过大众点评的API通常需要企业认证和申请,个人开发者可能难以直接使用。因此,一个常见的替代方案是通过网页爬虫来抓取数据。

这里提供一个使用requestsBeautifulSoup进行基础爬取的示例。请注意,实际操作前务必检查目标网站的robots.txt文件,并尊重其使用条款,避免高频请求对服务器造成压力。

import requests
from bs4 import BeautifulSoup
import re

def get_dianping_shop_location(shop_id):
    """
    根据商铺ID,尝试获取其地址信息。
    注意:大众点评的页面结构经常变动,此代码可能需要调整。
    """
    url = f'https://www.dianping.com/shop/{shop_id}'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
    }

    try:
        response = requests.get(url, headers=headers, timeout=10)
        response.raise_for_status() # 检查请求是否成功
        response.encoding = 'utf-8'

        soup = BeautifulSoup(response.text, 'html.parser')

        # 寻找地址信息 - 这是最关键的步骤,选择器需要根据实际页面更新
        # 方法1: 尝试通过常见的类名或标签寻找
        address_tag = soup.find('span', class_='address')
        if not address_tag:
            # 方法2: 尝试通过itemprop属性寻找(如果页面使用微数据)
            address_tag = soup.find('span', itemprop='street-address')
        if not address_tag:
            # 方法3: 使用正则表达式在页面文本中搜索
            match = re.search(r'地址[::]\s*([^\s<]+)', response.text)
            if match:
                return match.group(1)
            else:
                return "未在页面中找到明确的地址信息。"

        return address_tag.get_text(strip=True)

    except requests.exceptions.RequestException as e:
        return f"网络请求出错: {e}"
    except Exception as e:
        return f"解析过程中出现错误: {e}"

# 使用示例
if __name__ == '__main__':
    # 你需要一个真实的商铺ID,例如从大众点评网址中获取
    # 例如,对于 https://www.dianping.com/shop/H9zK5sF2ZqN7jXlR, ID 是 'H9zK5sF2ZqN7jXlR'
    test_shop_id = 'H9zK5sF2ZqN7jXlR' # 请替换为有效的ID
    location = get_dianping_shop_location(test_shop_id)
    print(f"商铺地址: {location}")

核心要点:

  1. 反爬虫机制:大众点评有较强的反爬措施,简单的requests可能很快会被屏蔽。你可能需要处理Cookie、动态加载(JavaScript渲染)等问题,考虑使用seleniumplaywright等浏览器自动化工具。
  2. 页面结构:网页的HTML结构可能随时更改,代码中的address_tag查找逻辑需要根据实际情况调整。使用浏览器的开发者工具(F12)检查元素是必须的。
  3. 合法性:确保你的数据抓取行为符合网站条款和法律法规,用于个人学习或获得授权的项目。

总结建议:优先考虑申请官方API,爬虫方案需谨慎使用并保持维护。

点评改版了 原来的页面是可以抓取的 现在好多字符都被替换了 地址都抓不全

view-source:http://www.dianping.com/shop/97297788

搜索关键字
shopGlat
shopGlng

#3 太感谢了

#2 那个用了 CSS 的 background-position,能想办法提取到的地址,但还是需要用百度 /高德的 API 转换经纬度信息

#3 不过程序处理的时候不还是要解决 header/cookie 之类的验证问题吗,这样相当于直接用浏览器访问了

没懂,这部分内容是 html 文本,你的代码只要修改一下最后
await page.goto(
http://www.dianping.com/shop/103638985’,
{ “waitUntil”: “networkidle0” }
);
await page.waitFor(6000);
let content = await page.content()

let lat = /shopGlat: *"\d+?.\d+?"/
let lng = /shopGlng: *"\d+?.\d+?"/
console.log(lat.exec(content)[0])
console.log(lng.exec(content)[0])
await browser.close();

就可以取到了
shopGlat: "32.023975"
shopGlng:“118.791344”

#7 感谢

回到顶部