Hướng dẫn cạo dữ liệu bản đồ Google với Python

Bình luận: 0

Việc quét dữ liệu từ Google Maps sử dụng Python cho phép thu thập thông tin có giá trị về các địa điểm, doanh nghiệp và dịch vụ, có lợi cho phân tích thị trường, xác định các địa điểm địa điểm mới tối ưu, duy trì các thư mục hiện tại, phân tích đối thủ cạnh tranh và đánh giá sự phổ biến của các địa điểm. Hướng dẫn này cung cấp một hướng dẫn toàn diện về cách trích xuất thông tin từ Google Maps sử dụng các yêu cầu của Thư viện Python và LXML. Nó bao gồm các hướng dẫn chi tiết về việc thực hiện các yêu cầu, xử lý phản hồi, phân tích dữ liệu có cấu trúc và xuất nó sang tệp CSV.

Thiết lập môi trường của bạn

Đảm bảo bạn đã cài đặt các thư viện Python sau:

  • requests;
  • lxml;
  • csv (Thư viện tiêu chuẩn).

Cài đặt các thư viện này bằng PIP nếu cần:


pip install requests
pip install lxml

Dưới đây, chúng tôi sẽ trình bày một quy trình cạo từng bước, hoàn thành với các ví dụ.

Hướng dẫn từng bước để lấy dữ liệu từ Google Maps

Trong các phần sau, chúng tôi sẽ đi qua một quy trình từng bước chi tiết để lấy dữ liệu từ Google Maps, hoàn thành với các ví dụ trực quan để hướng dẫn bạn qua từng giai đoạn.

Bước 1. Xác định URL mục tiêu

Chỉ định URL mà bạn muốn cạo dữ liệu.


url = "https link"

Bước 2. Xác định tiêu đề và proxy

Thiết lập các tiêu đề thích hợp là rất quan trọng để bắt chước các hoạt động của người dùng chính hãng, làm giảm đáng kể cơ hội của người cạo được gắn cờ dưới dạng bot. Ngoài ra, việc tích hợp các máy chủ proxy giúp duy trì các hoạt động cạo liên tục bằng cách phá vỡ bất kỳ khối nào có thể phát sinh từ việc vượt quá giới hạn yêu cầu liên quan đến một địa chỉ IP duy nhất.


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",
}

Bước 3. Tìm nạp nội dung trang

Gửi yêu cầu đến URL Google Maps và nhận nội dung trang:


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}")

Bước 4. Phân tích nội dung HTML

Sử dụng LXML để phân tích nội dung HTML:


from lxml import html

parser = html.fromstring(page_content)

Xác định dữ liệu XPaths

Hiểu cấu trúc của tài liệu HTML là rất quan trọng để trích xuất chính xác dữ liệu. Bạn cần xác định các biểu thức XPath cho các điểm dữ liệu bạn muốn cạo. Đây là cách bạn có thể làm điều đó:

  1. Kiểm tra trang web: Mở trang Google Maps trong trình duyệt web và sử dụng các công cụ phát triển trình duyệt > Kiểm tra) để kiểm tra cấu trúc HTML.
  2. Tìm các yếu tố có liên quan: Tìm các yếu tố HTML có chứa dữ liệu bạn muốn cạo (ví dụ: tên nhà hàng, địa chỉ).
  3. Viết XPaths: Dựa trên cấu trúc HTML, hãy viết các biểu thức XPath để trích xuất dữ liệu. Đối với hướng dẫn này, XPaths là:

Tên nhà hàng:


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

Địa chỉ:


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

Tùy chọn:


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

Vĩ độ địa lý:


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

Kinh độ địa lý:


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

Bước 5. Trích xuất dữ liệu

Trích xuất dữ liệu bằng Xpaths đã xác định:


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]

    # Nối vào danh sách dữ liệu
    data.append({
        "restaurant_name": restaurant_name,
        "address": address,
        "options": options,
        "geo_latitude": geo_latitude,
        "geo_longitude": geo_longitude
    })

Bước 6. Lưu dữ liệu vào CSV

Lưu dữ liệu được trích xuất vào tệp 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)

Hoàn thành mã

Dưới đây là mã hoàn chỉnh để cạo dữ liệu Google Maps:


import requests
from lxml import html
import csv

# Xác định URL mục tiêu và tiêu đề
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",
}

# Tìm nạp nội dung trang
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()

# Phân tích nội dung HTML
parser = html.fromstring(page_content)

# Trích xuất dữ liệu bằng cách sử dụng 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]

    # Nối vào danh sách dữ liệu
    data.append({
        "restaurant_name": restaurant_name,
        "address": address,
        "options": options,
        "geo_latitude": geo_latitude,
        "geo_longitude": geo_longitude
    })

# Lưu dữ liệu vào 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.")

Đối với việc cạo web hiệu quả, điều quan trọng là sử dụng các tiêu đề và proxy yêu cầu phù hợp. Các lựa chọn proxy tối ưu là trung tâm dữ liệu hoặc proxy ISP, cung cấp tốc độ cao và độ trễ thấp. Tuy nhiên, vì đây là những proxy tĩnh, việc thực hiện xoay IP là cần thiết để ngăn chặn việc chặn hiệu quả. Một tùy chọn thay thế và thân thiện hơn với người dùng là sử dụng các proxy dân cư. Các proxy động này đơn giản hóa quá trình xoay vòng và có yếu tố tin cậy cao hơn, làm cho chúng hiệu quả hơn trong việc phá vỡ các khối.

Bình luận:

0 Bình luận