使用 Python 搜索 Google 地图数据指南

评论: 0

使用 Python 从 Google 地图中抓取数据可以收集有关地点、企业和服务的有价值信息,有利于进行市场分析、确定最佳的新场所位置、维护当前目录、分析竞争对手以及衡量场所的受欢迎程度。本指南全面介绍了如何利用 Python 库 requests 和 lxml 从 Google 地图中提取信息。其中包括有关提出请求、处理响应、解析结构化数据以及将其导出到 CSV 文件的详细说明。

设置您的环境

确保安装了以下 Python 库:

  • requests;
  • lxml;
  • csv (标准图书馆).

如有需要,使用 pip 安装这些库:


pip install requests
pip install lxml

下面,我们将通过实例逐步介绍刮削过程。

从 Google 地图中获取数据的分步指南

在下面的章节中,我们将逐步详细介绍从 Google 地图搜索数据的过程,并通过可视化示例指导您完成每个阶段。

步骤 1.定义目标 URL

指定要从中抓取数据的 URL。


url = "https link"

步骤 2.定义标头和代理

设置适当的标头对于模仿真实用户的活动至关重要,可大大降低刮擦程序被标记为僵尸程序的几率。此外,集成代理服务器还可以规避因超过与单个 IP 地址相关的请求限制而可能产生的任何阻止,从而有助于保持持续的刮擦活动。


headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"',
    'sec-ch-ua-arch': '"x86"',
    'sec-ch-ua-bitness': '"64"',
    'sec-ch-ua-full-version-list': '"Not)A;Brand";v="99.0.0.0", "Google Chrome";v="127.0.6533.72", "Chromium";v="127.0.6533.72"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-model': '""',
    'sec-ch-ua-platform': '"Linux"',
    'sec-ch-ua-platform-version': '"6.5.0"',
    'sec-ch-ua-wow64': '?0',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36',
}

proxies = {
    "http": "http://username:password@your_proxy_ip:port",
    "https": "https://username:password@your_proxy_ip:port",
}

步骤 3.获取页面内容

向 Google 地图 URL 发送请求并获取页面内容:


import requests

response = requests.get(url, headers=headers, proxies=proxies)
if response.status_code == 200:
    page_content = response.content
else:
    print(f"Failed to retrieve the page. Status code: {response.status_code}")

步骤 4.解析 HTML 内容解析 HTML 内容

使用 lxml 解析 HTML 内容:


from lxml import html

parser = html.fromstring(page_content)

识别数据 XPath

了解 HTML 文档的结构对于正确提取数据至关重要。您需要为要抓取的数据点确定 XPath 表达式。下面是您的操作方法:

  1. 检查网页:在网页浏览器中打开 Google 地图页面,使用浏览器的开发工具(右键单击> 检查)检查 HTML 结构。
  2. 查找相关元素:查找包含您要抓取的数据(如餐厅名称、地址)的 HTML 元素。
  3. 编写 XPath:根据 HTML 结构,编写 XPath 表达式来提取数据。在本指南中,XPath 为

餐厅名称:


//div[@jscontroller="AtSb"]/div/div/div/a/div/div/div/span[@class="OSrXXb"]/text()

地址:


 //div[@jscontroller="AtSb"]/div/div/div/a/div/div/div[2]/text()

选项:


 = ', '.join(result.xpath('.//div[@jscontroller="AtSb"]/div/div/div/a/div/div/div[4]/div/span/span[1]//text()'))

地理纬度:


//div[@jscontroller="AtSb"]/div/@data-lat

地理经度:


 //div[@jscontroller="AtSb"]/div/@data-lng

步骤 5.提取数据

使用已识别的 XPaths 提取数据:


results = parser.xpath('//div[@jscontroller="AtSb"]')
data = []

for result in results:
    restaurant_name = result.xpath('.//div/div/div/a/div/div/div/span[@class="OSrXXb"]/text()')[0]
    address = result.xpath('.//div/div/div/a/div/div/div[2]/text()')[0]
    options = ', '.join(result.xpath('.//div/div/div/a/div/div/div[4]/div/span/span[1]//text()'))
    geo_latitude = result.xpath('.//div/@data-lat')[0]
    geo_longitude = result.xpath('.//div/@data-lng')[0]

    #追加到数据列表
    data.append({
        "restaurant_name": restaurant_name,
        "address": address,
        "options": options,
        "geo_latitude": geo_latitude,
        "geo_longitude": geo_longitude
    })

步骤 6.将数据保存为 CSV

将提取的数据保存为 CSV 文件:


import csv

with open("google_maps_data.csv", "w", newline='', encoding='utf-8') as csv_file:
    writer = csv.DictWriter(csv_file, fieldnames=["restaurant_name", "address", "options", "geo_latitude", "geo_longitude"])
    writer.writeheader()
    for entry in data:
        writer.writerow(entry)

完整代码

以下是完整的 Google 地图数据搜索代码:


import requests
from lxml import html
import csv

# 定义目标 URL 和标题
url = "https://www.google.com/search?sca_esv=04f11db33f1535fb&sca_upv=1&tbs=lf:1,lf_ui:4&tbm=lcl&sxsrf=ADLYWIIFVlh6WQCV6I2gi1yj8ZyvZgLiRA:1722843868819&q=google+map+restaurants+near+me&rflfq=1&num=10&sa=X&ved=2ahUKEwjSs7fGrd2HAxWh1DgGHbLODasQjGp6BAgsEAE&biw=1920&bih=919&dpr=1"
headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"',
    'sec-ch-ua-arch': '"x86"',
    'sec-ch-ua-bitness': '"64"',
    'sec-ch-ua-full-version-list': '"Not)A;Brand";v="99.0.0.0", "Google Chrome";v="127.0.6533.72", "Chromium";v="127.0.6533.72"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-model': '""',
    'sec-ch-ua-platform': '"Linux"',
    'sec-ch-ua-platform-version': '"6.5.0"',
    'sec-ch-ua-wow64': '?0',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36',
}
proxies = {
    "http": "http://username:password@your_proxy_ip:port",
    "https": "https://username:password@your_proxy_ip:port",
}

# 获取页面内容
response = requests.get(url, headers=headers, proxies=proxies)
if response.status_code == 200:
    page_content = response.content
else:
    print(f"Failed to retrieve the page. Status code: {response.status_code}")
    exit()

# 解析 HTML 内容
parser = html.fromstring(page_content)

# 使用 XPath 提取数据
results = parser.xpath('//div[@jscontroller="AtSb"]')
data = []

for result in results:
    restaurant_name = result.xpath('.//div/div/div/a/div/div/div/span[@class="OSrXXb"]/text()')[0]
    address = result.xpath('.//div/div/div/a/div/div/div[2]/text()')[0]
    options = ', '.join(result.xpath('.//div/div/div/a/div/div/div[4]/div/span/span[1]//text()'))
    geo_latitude = result.xpath('.//div/@data-lat')[0]
    geo_longitude = result.xpath('.//div/@data-lng')[0]

    # 追加到数据列表
    data.append({
        "restaurant_name": restaurant_name,
        "address": address,
        "options": options,
        "geo_latitude": geo_latitude,
        "geo_longitude": geo_longitude
    })

# 将数据保存为 CSV
with open("google_maps_data.csv", "w", newline='', encoding='utf-8') as csv_file:
    writer = csv.DictWriter(csv_file, fieldnames=["restaurant_name", "address", "options", "geo_latitude", "geo_longitude"])
    writer.writeheader()
    for entry in data:
        writer.writerow(entry)

print("Data has been successfully scraped and saved to google_maps_data.csv.")

要有效地进行网络刮擦,使用正确的请求头和代理至关重要。最佳的代理选择是数据中心或 ISP 代理,它们提供高速度和低延迟。不过,由于这些都是静态代理,因此有必要实施 IP 轮换,以有效防止拦截。另一种更方便用户的选择是使用住宅代理。这些动态代理可简化轮换过程,并具有更高的信任系数,因此能更有效地规避封堵。

评论:

0 评论