La extracción de datos de Google Maps mediante Python permite recopilar información valiosa sobre ubicaciones, negocios y servicios, lo que resulta beneficioso para el análisis de mercado, la identificación de ubicaciones óptimas para nuevos locales, el mantenimiento de los directorios actuales, el análisis de la competencia y la medición de la popularidad de los lugares. Esta guía proporciona un recorrido completo sobre cómo extraer información de Google Maps utilizando las bibliotecas de Python requests y lxml. Incluye instrucciones detalladas sobre cómo realizar solicitudes, manejar respuestas, analizar datos estructurados y exportarlos a un archivo CSV.
Asegúrate de tener instaladas las siguientes librerías de Python:
Instala estas librerías usando pip si es necesario:
pip install requests
pip install lxml
A continuación, presentaremos un proceso de scraping paso a paso, completo con ejemplos.
En las siguientes secciones, recorreremos un proceso detallado paso a paso para raspar datos de Google Maps, completo con ejemplos visuales para guiarlo a través de cada etapa.
Especifica la URL desde la que quieres hacer scraping de datos.
url = "https link"
Configurar las cabeceras apropiadas es crucial para imitar las actividades de un usuario genuino, reduciendo significativamente las posibilidades de que el scraper sea marcado como bot. Además, la integración de servidores proxy ayuda a mantener actividades de scraping continuas al eludir cualquier bloqueo que pueda surgir por superar los límites de solicitudes asociados a una única dirección 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",
}
Envía una petición a la URL de Google Maps y obtén el contenido de la página:
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}")
Utiliza lxml para analizar el contenido HTML:
from lxml import html
parser = html.fromstring(page_content)
Entender la estructura del documento HTML es crucial para extraer los datos correctamente. Usted necesita identificar las expresiones XPath para los puntos de datos que desea raspar. He aquí cómo puedes hacerlo:
Nombre del restaurante:
//div[@jscontroller="AtSb"]/div/div/div/a/div/div/div/span[@class="OSrXXb"]/text()
Dirección:
//div[@jscontroller="AtSb"]/div/div/div/a/div/div/div[2]/text()
Opciones:
= ', '.join(result.xpath('.//div[@jscontroller="AtSb"]/div/div/div/a/div/div/div[4]/div/span/span[1]//text()'))
Geo Latitud:
//div[@jscontroller="AtSb"]/div/@data-lat
Longitud geográfica:
//div[@jscontroller="AtSb"]/div/@data-lng
Extraer los datos utilizando los XPaths identificados:
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]
# Añadir a la lista de datos
data.append({
"restaurant_name": restaurant_name,
"address": address,
"options": options,
"geo_latitude": geo_latitude,
"geo_longitude": geo_longitude
})
Guarde los datos extraídos en un archivo 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)
Aquí tienes el código completo para scrapear los datos de Google Maps:
import requests
from lxml import html
import csv
# Definir la URL de destino y las cabeceras
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",
}
# Obtener el contenido de la página
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()
# Analizar el contenido HTML
parser = html.fromstring(page_content)
# Extraer datos mediante 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]
# Añadir a la lista de datos
data.append({
"restaurant_name": restaurant_name,
"address": address,
"options": options,
"geo_latitude": geo_latitude,
"geo_longitude": geo_longitude
})
# Guardar datos en 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.")
Para un raspado web eficaz, es crucial utilizar las cabeceras de solicitud y los proxies adecuados. Las opciones óptimas de proxy son los proxies de centros de datos o ISP, que ofrecen altas velocidades y baja latencia. Sin embargo, dado que se trata de proxies estáticos, es necesario implementar la rotación de IP para evitar el bloqueo de forma eficaz. Una opción alternativa y más fácil de usar es utilizar proxies residenciales. Estos proxies dinámicos simplifican el proceso de rotación y tienen un mayor factor de confianza, lo que los hace más eficaces para eludir los bloqueos.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Comentarios: 0