Trích xuất dữ liệu từ Google Maps bằng Python

Nếu bạn kiểm tra mã nguồn của trang, bạn sẽ tìm thấy khối

"place_results": {
  "title": "Pike's Landing",
  "data_id": "0x51325b1733fa71bf:0xd609c9524d75cbc7",
  "reviews_link": "https://serpapi.com/search.json?engine=google_maps_reviews&hl=en&place_id=0x51325b1733fa71bf:0xd609c9524d75cbc7",
  "gps_coordinates": {
    "latitude": 64.8299557,
    "longitude": -147.8488774
  },
  "thumbnail": "https://lh5.googleusercontent.com/p/AF1QipNtwheOCQ97QFrUNIwKYUoAPiV81rpiW5cIiQco=w152-h86-k-no",
  "rating": 3.9,
  "reviews": 825,
  "price": "$$",
  "type": [
    "American restaurant"
  ],
  "description": "Burgers, seafood, steak & river views. Pub fare alongside steak & seafood, served in a dining room with river views & a waterfront patio.",
  "service_options": {...},
  "extensions": [...],
  "address": "4438 Airport Way, Fairbanks, AK 99709",
  "website": "https://www.pikeslodge.com/pikes-landing",
  "phone": "(907) 479-6500",
  "hours": [...],
  "images": [...],
  "user_reviews": {
    "summary": [...],
    "most_relevant": [
      {
        "username": "Vasisht Raghavendra",
        "rating": 5,
        "description": "Restaurant with a view and good food. The Biggest Berry Blast cocktail is a highly recommended one. For food we tried the Alaska Crab with Mushrooms and the Bisque. Both were excellent. For dessert we tried the Bread Pudding - probably not the best we have had. The ambiance is very nice and the servers are friendly.",
        "images": [...],
        "date": "2 months ago"
      },
      ...
    ]
  },
  ...
}
1 chứa JSON với tất cả dữ liệu địa điểm. Bạn sẽ chỉ phải phân tích nó

Bạn cũng có thể sử dụng giải pháp của bên thứ ba như SerpApi. Đó là API trả phí với bản dùng thử miễn phí

from serpapi import GoogleSearch

params = {
  "engine": "google_maps",
  "type": "place",
  "q": "Pike's Landing",
  "ll": "@40.7455096,-74.0083012,14z",
  "data": "!3m1!4b1!4m5!3m4!1s0x0:0xd609c9524d75cbc7!8m2!3d64.8299557!4d-147.8488774"
  "api_key": "API_KEY",
}

search = GoogleSearch(params)
results = search.get_dict()

đầu ra ví dụ

"place_results": {
  "title": "Pike's Landing",
  "data_id": "0x51325b1733fa71bf:0xd609c9524d75cbc7",
  "reviews_link": "https://serpapi.com/search.json?engine=google_maps_reviews&hl=en&place_id=0x51325b1733fa71bf:0xd609c9524d75cbc7",
  "gps_coordinates": {
    "latitude": 64.8299557,
    "longitude": -147.8488774
  },
  "thumbnail": "https://lh5.googleusercontent.com/p/AF1QipNtwheOCQ97QFrUNIwKYUoAPiV81rpiW5cIiQco=w152-h86-k-no",
  "rating": 3.9,
  "reviews": 825,
  "price": "$$",
  "type": [
    "American restaurant"
  ],
  "description": "Burgers, seafood, steak & river views. Pub fare alongside steak & seafood, served in a dining room with river views & a waterfront patio.",
  "service_options": {...},
  "extensions": [...],
  "address": "4438 Airport Way, Fairbanks, AK 99709",
  "website": "https://www.pikeslodge.com/pikes-landing",
  "phone": "(907) 479-6500",
  "hours": [...],
  "images": [...],
  "user_reviews": {
    "summary": [...],
    "most_relevant": [
      {
        "username": "Vasisht Raghavendra",
        "rating": 5,
        "description": "Restaurant with a view and good food. The Biggest Berry Blast cocktail is a highly recommended one. For food we tried the Alaska Crab with Mushrooms and the Bisque. Both were excellent. For dessert we tried the Bread Pudding - probably not the best we have had. The ambiance is very nice and the servers are friendly.",
        "images": [...],
        "date": "2 months ago"
      },
      ...
    ]
  },
  ...
}

Bạn có thể xem tài liệu để biết thêm chi tiết

từ chối trách nhiệm. Tôi làm việc tại SerpApi

Trong bài viết này, tôi muốn chia sẻ với các bạn một số kiến ​​thức về cách áp dụng data scraping bằng thư viện Selenium và BeautifulSoup của Python. sự kết hợp của hai công cụ này theo đúng cách cho phép xác định một bộ API để thu thập dữ liệu từ hầu hết mọi trang web

Ghi chú. bất kỳ dữ liệu nào được thu thập từ các trang web đều có thể có bản quyền, do đó có nghĩa là không được sử dụng lại nếu không có sự đồng ý của chủ sở hữu và chắc chắn không được sử dụng cho mục đích thương mại

Mục tiêu chính của bài viết này là chỉ ra cách thu thập dữ liệu dưới dạng bài tập mã hóa, cũng như cách xây dựng bộ dữ liệu cho các dự án nghiên cứu và/hoặc cá nhân

Sau tuyên bố từ chối trách nhiệm ngắn này, chúng ta sẽ bắt đầu chứ?

Hãy bắt đầu từ các công cụ

Trăn Anaconda

Anaconda là một khung giúp duy trì các phụ thuộc thư viện Python cho từng dự án một cách minh bạch, sử dụng khái niệm môi trường ảo. bạn tạo một môi trường, cài đặt từng thư viện bên trong nó và bạn kích hoạt/hủy kích hoạt môi trường dựa trên nhu cầu của mình mà không can thiệp vào các phần phụ thuộc của dự án khác. Bạn có thể tải về tại đây

Công cụ này không bắt buộc, nó có thể được thay thế bằng bất kỳ thư viện môi trường ảo nào (e. g. virtualenv), nhưng nó có thể hữu ích nếu bạn muốn thêm các bước tiếp theo như làm sạch dữ liệu, phân tích dữ liệu và học máy ở cuối quy trình được trình bày tại đây. Ngoài ra, bạn cũng có thể cài đặt các thư viện được mô tả thông qua pip

Dù sao, để tạo môi trường cạo của chúng tôi, hãy chạy đoạn mã sau

conda create --name scraping python=3.6
conda activate scraping

selen

Selenium là một khung được xây dựng để thử nghiệm tự động ứng dụng web. API của nó cho phép chúng tôi mô phỏng các lần nhấp, cuộn và bất kỳ tương tác nào khác xảy ra trên một trang web. Vì lý do này, nó cũng cực kỳ hữu ích để quét các trang web. các lần nhấp và cuộn kích hoạt các thay đổi trong trang, tải nhiều dữ liệu hơn (hoặc các loại dữ liệu khác)

Thư viện được viết bằng Java, Python, C#, JavaScript và nhiều ngôn ngữ khác. trong bài viết này, chúng tôi sẽ sử dụng triển khai Python để tải trang web mục tiêu và tạo tất cả các tương tác cần thiết để truy xuất thông tin bổ sung

Để cài đặt Selenium, hãy chạy lệnh

conda install -c conda-forge selenium

Chúng tôi cũng cần cài đặt webdriver của trình duyệt mà chúng tôi muốn sử dụng. Trình điều khiển web là một phần mềm tự động chạy một phiên bản trình duyệt, trên đó Selenium sẽ hoạt động

Tôi đã quyết định sử dụng Google Chromedriver, bạn có thể tải xuống từ đây, nhưng bất kỳ trình điều khiển nào cũng sẽ hoạt động tốt

Chú ý. các bài kiểm tra thủ công mà chúng ta sẽ thấy sau phải được chạy bằng trình duyệt mà chúng ta chọn ở bước này

ĐẹpSúp

BeautifulSoup là một thư viện Python gốc phân tích các tệp HTML và XML. nó giúp điều hướng các nút của cây, truy cập các thuộc tính và thuộc tính một cách rất trực quan

Công dụng chính của chúng tôi là phân tích cú pháp trang HTML sau khi được xử lý bởi Selenium, trích xuất thông tin dưới dạng văn bản thô và gửi nó để xử lý thêm

Để cài đặt thư viện trong môi trường conda của chúng tôi, hãy chạy lệnh

conda install -c anaconda beautifulsoup4

Chà, bây giờ chúng ta đã sẵn sàng để bắt đầu xác định mô-đun cạo của mình

Ví dụ mục tiêu sẽ cho thấy cách thu thập các bài đánh giá Google Maps mới nhất. chúng tôi sẽ xác định một trình quét điều hướng đến một điểm ưa thích cụ thể (POI kể từ bây giờ) và truy xuất các đánh giá mới nhất được liên kết của nó

1. Khởi tạo

Bước đầu tiên, chúng ta cần khởi tạo webdriver của mình. Trình điều khiển có thể được định cấu hình với một số tùy chọn, nhưng hiện tại chúng tôi chỉ đặt tiếng Anh làm ngôn ngữ trình duyệt

options = Options()
options.add_argument("--lang=en")
driver = webdriver.Chrome(chrome_options=options)

2. Nhập URL

Sau đó, chúng tôi cần cung cấp trang mục tiêu của mình. vì chúng tôi muốn thu thập các bài đánh giá trên Google Maps, chúng tôi chọn một POI và lấy url trỏ trực tiếp đến các bài đánh giá. Ở bước này, người lái xe chỉ cần mở trang

Trang mục tiêu ví dụ cho các bài đánh giá GM

URL loại này khá phức tạp. chúng ta cần sao chép thủ công từ trình duyệt vào một biến và chuyển nó cho trình điều khiển

url = https://www.google.it/maps/place/Pantheon/@41.8986108,12.4746842,17z/data=!3m1!4b1!4m7!3m6!1s0x132f604f678640a9:0xcad165fa2036ce2c!8m2!3d41.8986108!4d12.4768729!9m1!1b1driver.get(url)

3. Nhấp vào nút Menu

Bây giờ, chúng tôi muốn trích xuất các bài đánh giá mới nhất, trong khi cài đặt mặc định của trang hiển thị những bài đánh giá phù hợp nhất. Chúng ta cần nhấp vào menu “Sắp xếp” và sau đó, tab “Mới nhất”

Đây là nơi Selenium (và các kỹ năng mã hóa) thực sự phát huy tác dụng. chúng ta cần tìm nút, nhấp vào nút đó rồi nhấp vào nút thứ hai. Với mục đích này, tôi đã sử dụng các phương pháp tìm kiếm XPath do Selenium cung cấp. nó có thể dễ dàng hơn tìm kiếm CSS, cũng nhờ Chropath, một tiện ích mở rộng của trình duyệt bổ sung trình thông dịch XPath vào các công cụ dành cho nhà phát triển trình duyệt

Bằng cách này, chúng tôi kiểm tra trang để kiểm tra các biểu thức cho đến khi chúng tôi đánh dấu các phần tử mong muốn

Kiểm tra biểu thức XPath cho nút đầu tiên

Kiểm tra biểu thức XPath cho nút thứ hai

Thật không may, điều này là không đủ. Trang web Google Maps (cũng như nhiều trang web hiện đại khác) được triển khai chủ yếu bằng AJAX. nhiều phần của trang web được tải không đồng bộ, nghĩa là các nút có thể không được tải nếu Selenium tìm kiếm chúng ngay sau khi tải trang

Nhưng chúng tôi cũng có một giải pháp trong tình huống đó. Selenium thực hiện các chức năng chờ. nhấp chuột được thực hiện sau khi các điều kiện nhất định đã được xác minh hoặc sau khi hết thời gian chờ tối đa. Đợi cho đến khi phần tử xuất hiện và có thể nhấp được trên trang sẽ giải quyết vấn đề trước đó

Mã cho phần đó là

wait = WebDriverWait(driver, 10)
menu_bt = wait.until(EC.element_to_be_clickable(
(By.XPATH, '//button[@data-value=\'Sort\']'))
)
menu_bt.click()
recent_rating_bt = driver.find_elements_by_xpath(
'//div[@role=\'menuitem\']')[1]
recent_rating_bt.click()
time.sleep(5)

Chức năng ngủ được thêm vào cuối khối này vì nhấp chuột sẽ kích hoạt lệnh gọi AJAX để tải lại các đánh giá, do đó chúng tôi cần đợi trước khi chuyển sang bước tiếp theo…

4. Đánh giá trích xuất dữ liệu

Và bây giờ, cuối cùng, chúng tôi đã đạt được mục tiêu, xem xét dữ liệu. Chúng tôi gửi trang tới trình phân tích cú pháp BeautifulSoup để giúp tìm các thẻ, div và thuộc tính HTML chính xác

Đầu tiên, chúng tôi xác định div trình bao bọc của bài đánh giá. phương thức find_all tạo danh sách các phần tử div tôn trọng các thuộc tính cụ thể. Trong trường hợp của chúng tôi, danh sách chứa div của các bài đánh giá có trên trang

________số 8

Đối với mỗi đánh giá, chúng tôi phân tích thông tin của nó. xếp hạng sao, nội dung văn bản (nếu có), ngày đánh giá, tên người đánh giá, id của đánh giá

id_r = r.find('button', 
class_='section-review-action-menu')['data-review-id']
username = r.find('div',
class_='section-review-title').find('span').text
try:
review_text = r.find('span', class_='section-review-text').text
except Exception:
review_text = None
rating = r.find('span', class_='section-review-stars')['aria-label']
rel_date = r.find('span', class_='section-review-publish-date').text

5. cuộn

Cuối cùng nhưng không kém phần quan trọng. trang đã tải 20 đánh giá, nhưng những đánh giá khác không khả dụng nếu không cuộn xuống trang

Tính năng cuộn không được triển khai trực tiếp trong Selenium API, nhưng chúng cho phép thực thi mã JavaScript và áp dụng nó vào một thành phần cụ thể của trang. chúng tôi xác định đối tượng div có thể cuộn được và chúng tôi chạy một dòng mã JS đơn giản để cuộn xuống cuối trang

"place_results": {
  "title": "Pike's Landing",
  "data_id": "0x51325b1733fa71bf:0xd609c9524d75cbc7",
  "reviews_link": "https://serpapi.com/search.json?engine=google_maps_reviews&hl=en&place_id=0x51325b1733fa71bf:0xd609c9524d75cbc7",
  "gps_coordinates": {
    "latitude": 64.8299557,
    "longitude": -147.8488774
  },
  "thumbnail": "https://lh5.googleusercontent.com/p/AF1QipNtwheOCQ97QFrUNIwKYUoAPiV81rpiW5cIiQco=w152-h86-k-no",
  "rating": 3.9,
  "reviews": 825,
  "price": "$$",
  "type": [
    "American restaurant"
  ],
  "description": "Burgers, seafood, steak & river views. Pub fare alongside steak & seafood, served in a dining room with river views & a waterfront patio.",
  "service_options": {...},
  "extensions": [...],
  "address": "4438 Airport Way, Fairbanks, AK 99709",
  "website": "https://www.pikeslodge.com/pikes-landing",
  "phone": "(907) 479-6500",
  "hours": [...],
  "images": [...],
  "user_reviews": {
    "summary": [...],
    "most_relevant": [
      {
        "username": "Vasisht Raghavendra",
        "rating": 5,
        "description": "Restaurant with a view and good food. The Biggest Berry Blast cocktail is a highly recommended one. For food we tried the Alaska Crab with Mushrooms and the Bisque. Both were excellent. For dessert we tried the Bread Pudding - probably not the best we have had. The ambiance is very nice and the servers are friendly.",
        "images": [...],
        "date": "2 months ago"
      },
      ...
    ]
  },
  ...
}
0

Như bạn có thể thấy, trong hướng dẫn ngắn gọn này, tôi đã cố gắng giải thích các yếu tố cốt lõi để thu thập các bài đánh giá từ Google Maps, nhưng các khái niệm tương tự cũng có thể áp dụng cho nhiều trang web hiện đại. Độ phức tạp cao và tôi đã không xem xét tất cả các chi tiết ở đây. nếu bạn muốn có một ví dụ hoàn chỉnh, hãy kiểm tra kho lưu trữ của tôi trên Github tại đây

Làm cách nào để trích xuất dữ liệu từ bản đồ Google bằng Python?

Scrap Google Maps bằng cách sử dụng SDK .
Bạn sẽ cần python3+ và gói python này. Cài đặt gói bằng cách chạy lệnh sau. .
Nhận khóa API của bạn từ trang hồ sơ
Nhập gói và khởi tạo gói bằng khóa. .
Đợi vài giây cho đến khi dữ liệu sẽ được tìm nạp

Bạn có thể xuất dữ liệu từ Google Maps không?

Trên máy tính của bạn, hãy đăng nhập vào Bản đồ của tôi. mở bản đồ. Xuất sang KML/KMZ . Thực hiện theo các hướng dẫn trên màn hình.

Làm cách nào để tích hợp bản đồ Google trong Python?

Lưu khóa API trong tệp văn bản. Viết mã để đọc trong khóa và lưu dưới dạng biến. .
Xác định vị trí 1 trong tọa độ
Xác định vị trí 2 trong tọa độ
Tạo lớp bằng gmap. hướng. Hướng
Thêm lớp vào bản đồ

Những loại dữ liệu nào có thể được trích xuất từ ​​Google Map?

Bạn có thể trích xuất tên địa điểm (không nhất thiết là nhà hàng), xếp hạng, địa chỉ, trang web, số điện thoại và thời gian mở cửa bằng . Chỉ cần nhập từ khóa bạn muốn tìm kiếm và bot sẽ lấy dữ liệu cho bạn trong vòng vài phút.