如何提取动态网站数据?爬取dlivery平台餐厅名址无数据解决方法
问题原因
目标站点是前端动态渲染的单页应用,直接请求页面URL拿到的只是未填充数据的HTML框架,餐厅名称、地址这类业务数据是页面加载完成后,由浏览器异步调用后端接口拉取再渲染到页面上的,不会出现在requests拿到的初始响应里,BeautifulSoup自然解析不到对应内容。
实现方案
不需要用Selenium、Playwright这类重量的浏览器自动化工具,直接抓包找到页面拉取数据的后端接口,请求接口拿结构化JSON数据即可,效率更高也更稳定:
- 用浏览器打开目标页面,按F12打开开发者工具,切换到「网络」面板,筛选「Fetch/XHR」类型的请求,刷新页面
- 在请求列表里找到返回餐厅列表数据的接口,这个站点的列表接口没有复杂的鉴权校验,直接模拟请求就能拿到数据
- 接口返回的是标准JSON格式,直接按字段提取餐厅名称、地址即可,不需要解析HTML
参考实现代码:
import requests api_url = "https://customers.dlivery.live/api/v1/shops" headers = { "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36", "Accept": "application/json", "Referer": "https://customers.dlivery.live/en/list" } response = requests.get(api_url, headers=headers) response.raise_for_status() shop_list = response.json() for shop in shop_list: shop_name = shop.get("name", "无名称信息") shop_address = shop.get("address", "无地址信息") print(f"餐厅名称:{shop_name},地址:{shop_address}")
注意事项
- 如果后续接口路径调整,按照前面说的抓包流程找到最新的接口地址,复现浏览器里的请求头、请求参数即可
- 接口返回的字段可能随站点迭代变动,如果拿不到名称、地址字段,可以打印完整的JSON响应查看最新的字段名
- 请求时控制下访问频率,不要短时间发送大量请求,避免被站点封禁IP
内容的提问来源于stack exchange,提问作者coding2
相关产品推荐
相关产品推荐

