Bỏ để qua phần nội dung

Vượt qua giới hạn 120 địa điểm của API Google Địa điểm: Hướng dẫn dành cho chuyên gia

Là một chuyên gia thu thập dữ liệu web với hơn 5 năm kinh nghiệm trích xuất dữ liệu từ Google Maps, tôi đã học được một vài điều về cách vượt qua các giới hạn. Vì vậy, bạn muốn lấy hơn 100,000 địa điểm từ API Google Địa điểm? Vâng, bạn đã đến đúng nơi!

Trong hướng dẫn toàn diện hơn 2,000 từ này, tôi sẽ chia sẻ một số phương pháp đã được chứng minh để trích xuất nhiều dữ liệu Google Địa điểm như bạn mong muốn.

Các kỹ thuật nâng cao này vượt xa API cơ bản, tận dụng các tập lệnh tùy chỉnh, nguồn dữ liệu không chính thức, proxy, v.v.

Tôi cũng sẽ hướng dẫn bạn qua các ví dụ thực tế và mã mẫu để bạn có thể tích hợp các chiến lược này vào dự án của riêng mình.

Cuối cùng, bạn sẽ trở thành chuyên gia trong việc vượt qua các giới hạn của Google và giải phóng toàn bộ sức mạnh của dữ liệu Địa điểm cho nhu cầu của mình.

Hãy đi sâu vào!

Nỗi đau khi chỉ đạt được 120 vị trí

Như bạn có thể biết, API Google Địa điểm giới hạn bạn chỉ ở 120 địa điểm cho mỗi truy vấn. Đối với hầu hết các dự án, 120 địa điểm không đủ.

Hãy nghĩ về nó…

  • Chỉ riêng ở Mỹ đã có hơn 8,000 địa điểm Starbucks. Chúc may mắn lấy được tất cả chúng với giá 120 mỗi cuộc gọi.

  • Thành phố Los Angeles có hơn 15,000 nhà hàng. Với 120 cho mỗi truy vấn, bạn cần thực hiện 125 yêu cầu API để có được tất cả.

  • Nếu bạn muốn xây dựng một danh mục về mọi trung tâm mua sắm ở Mỹ (trên 1,000), bạn sẽ nhanh chóng đạt đến giới hạn.

Và nếu bạn cho rằng 120 cho mỗi yêu cầu có vẻ thấp, hãy biết rằng trước đây chỉ có 20 địa điểm trước khi Google tăng giới hạn vào năm 2019. Vì vậy, về cơ bản, họ nhận ra rằng thường cần nhiều kết quả hơn nữa.

Tại sao Google giới hạn địa điểm một cách nghiêm ngặt như vậy?

Google muốn ngăn chặn những yêu cầu quá lớn có thể làm quá tải máy chủ của họ. Vì vậy, họ đã giới hạn số lượng vị trí ở quy mô hợp lý cho các trường hợp sử dụng thông thường.

Nhưng đối với những người sử dụng thành thạo như chúng tôi thì 120 chỗ thôi là chưa đủ.

Rất may, với các công cụ và kỹ thuật phù hợp, chúng ta có thể truy cập hàng triệu địa điểm từ Google nếu cần.

Hãy xem làm thế nào.

Phương pháp 1: Sử dụng nhiều truy vấn với yêu cầu được phân trang

Cách được hỗ trợ chính thức để vượt quá giới hạn 120 vị trí là sử dụng các yêu cầu được phân trang. Đây là cách nó hoạt động…

Đầu tiên, thiết lập pagetoken tham số để null để có được 60 kết quả đầu tiên:

https://maps.googleapis.com/maps/api/place/textsearch/json?query=restaurants+in+LA&pagetoken=null

Phản hồi bao gồm một next_page_token lĩnh vực như "CpQCBAAA...". Vượt qua điều này như pagetoken trong yêu cầu tiếp theo của bạn:

https://maps.googleapis.com/maps/api/place/textsearch/json?query=restaurants+in+LA&pagetoken=CpQCBAAA...

Điều này trả về 60 tiếp theo. Tiếp tục chuyển cái mới nhất next_page_token để dần dần phân trang qua tất cả các kết quả.

Lý tưởng nhất là kết hợp điều này với nhiều khóa API để thực hiện các truy vấn phân trang đồng thời. Bộ điều hợp này tôi đã xây dựng đồng thời 3 phím truy vấn để tăng tốc độ phân trang:

// Paginate requests concurrently with multiple API keys

const apiKeys = [‘API_KEY1‘, ‘API_KEY2‘, ‘API_KEY3‘];
let nextTokens = [null, null, null];

function paginateResults(query) {

  let promise1 = placesApi.textSearch({query, pagetoken: nextTokens[0]});
  let promise2 = placesApi.textSearch({query, pagetoken: nextTokens[1]}); 
  let promise3 = placesApi.textSearch({query, pagetoken: nextTokens[2]});

  Promise.all([promise1, promise2, promise3])
    .then(responses => {
      // Extract places from responses

      // Save nextTokens
      nextTokens[0] = responses[0].next_page_token; 
      nextTokens[1] = responses[1].next_page_token;
      nextTokens[2] = responses[2].next_page_token;

      paginateResults(query); // Call again to keep paginating      
    });

}

Điều này cho phép tôi phân trang qua các kết quả nhanh hơn gấp 3 lần bằng cách phân loại đồng thời các yêu cầu trên nhiều khóa API.

Với chiến lược này, bạn có thể truy xuất tới 360 địa điểm cho mỗi cuộc gọi (phím 120 * 3). Để nhận được nhiều hơn, chỉ cần tiếp tục phân trang với các yêu cầu tiếp theo.

Pro Mẹo: Lưu trữ cục bộ từng trang kết quả để bạn không lặp lại lệnh gọi API nếu xảy ra lỗi.

Hạn chế của việc phân trang

Nhược điểm là bạn cần phải tự mình xử lý tất cả logic phân trang. Và mặc dù bạn có thể tăng tốc độ bằng các yêu cầu đồng thời, nhưng nó thường vẫn chậm hơn so với một truy vấn hàng loạt.

Phân trang hoạt động tốt nhất nếu bạn chỉ cần thêm vài nghìn vị trí vượt quá giới hạn. Nhưng một khi bạn đã đến được hàng chục hoặc hàng trăm nghìn địa điểm, các cách tiếp cận khác sẽ trở nên hiệu quả hơn…

Phương pháp 2: Chia vùng tìm kiếm thành các lưới nhỏ hơn

Đối với số lượng lớn, tôi nhận thấy việc chia khu vực tìm kiếm thành "lưới" mang lại kết quả tốt nhất.

Các bước thực hiện:

  1. Chia vị trí mục tiêu của bạn thành nhiều khu vực tìm kiếm nhỏ hơn.

  2. Truy vấn từng khu vực một cách độc lập để truy xuất đầy đủ 120 địa điểm cho mỗi phần.

  3. Kết hợp các kết quả từ từng khu vực vào tập dữ liệu hoàn chỉnh của bạn.

Hãy cùng xem qua quy trình làm việc mẫu…

Hãy tưởng tượng tôi cần có được tất cả các nhà hàng ở Manhattan. Đó là hơn 15,000 địa điểm, vượt xa giới hạn 120.

Đây là cách tôi trích xuất tất cả chúng:

  1. Chia Manhattan thành các lưới. Tôi sẽ chia nó thành các vùng lân cận hoặc mã ZIP khác nhau. Ví dụ:

    10021
    10022
    10023
    10075

    Và cứ thế cho tất cả các mã ZIP của Manhattan…

  2. Truy vấn từng lưới. Đối với mỗi mã ZIP, tôi sẽ thực hiện tìm kiếm văn bản như:

    https://maps.googleapis.com/maps/api/place/textsearch/json?query=restaurants+in+10021

    Điều đó trả về 120 nhà hàng đầu tiên trong ZIP đó.

  3. Tổng hợp tất cả các kết quả. Tôi sẽ tìm kiếm từng mã ZIP, sau đó kết hợp tất cả các địa điểm thành một danh sách lớn gồm hơn 15,000 nhà hàng!

Xem nó hoạt động như thế nào? Bằng cách chia các khu vực thành các phân đoạn nhỏ hơn, bạn có thể truy xuất 120 vị trí cho mỗi phần. Tỷ lệ này lên tới tổng số địa điểm bất kỳ.

Và một lần nữa, việc thực hiện song song các tìm kiếm dạng lưới này để có tốc độ cao hơn sẽ giúp ích. Tôi thích sử dụng Node.js để viết kịch bản.

Tạo lưới tối ưu

Có một số cách để chia bản đồ thành các lưới:

  • Theo khu phố hoặc quận
  • Sử dụng mã ZIP/bưu chính
  • Với giới hạn vĩ độ/kinh độ cụ thể
  • Khoảng cách bằng nhau là 0.1 vĩ độ/độ dài

Làm cho lưới của bạn đủ nhỏ để tối đa hóa kết quả cho mỗi truy vấn. Nhưng không quá nhỏ để bạn liên tục chạm vào những chỗ giống nhau.

Sự cân bằng tối ưu phụ thuộc vào tổng diện tích bản đồ và mật độ địa điểm. Nhưng đối với hầu hết các thành phố, lưới điện từ 0.5 – 1 dặm vuông hoạt động tốt.

Thử nghiệm với các mức độ chi tiết khác nhau để xem điều gì mang lại những địa điểm độc đáo nhất.

Nhược điểm chính của tìm kiếm lưới là độ phức tạp mã hóa tăng thêm để phân chia các vùng và kết hợp các kết quả. Yêu cầu được phân trang dễ thực hiện hơn.

Nhưng hiệu suất đạt được khiến lưới trở nên xứng đáng. Tôi đã sử dụng phương pháp này để trích xuất thành công tới 300,000 địa điểm từ Google – vượt xa giới hạn 120.

Bây giờ chúng ta hãy xem xét một tùy chọn thậm chí còn mạnh mẽ hơn (nhưng phức tạp)…

Phương pháp 3: Quét kết quả tìm kiếm của Google Maps

Tìm kiếm của Google Maps trả về nhiều kết quả hơn mức API của họ cho phép. Chúng tôi có thể tận dụng điều này trực tiếp bằng cách thu thập dữ liệu trang web của họ.

Dưới đây là các bước cơ bản:

  1. Tìm kiếm danh mục địa điểm trên Google Maps, chẳng hạn như "pizza ở Chicago".

  2. Sử dụng trình quét web để trích xuất dữ liệu từ kết quả được hiển thị.

  3. Lặp lại các chế độ xem bản đồ và mức thu phóng để kích hoạt nhiều địa điểm hơn.

  4. Kết hợp tất cả dữ liệu đã được thu thập vào tập dữ liệu của bạn.

Điều này cho phép bạn truy cập vào chỉ mục đầy đủ các địa điểm của Google. Vấn đề là trang web của họ sử dụng cách phân trang và kết xuất JavaScript phức tạp.

Hãy cùng tìm hiểu kiến ​​trúc Scraper mẫu…

Đầu tiên, tôi mã hóa vị trí tìm kiếm để lấy điểm trung tâm bản đồ tối ưu:

// Geocode city to get centerpoint lat/lng

let response = await fetch(`https://maps.googleapis.com/maps/api/geocode/json?address=Chicago+IL`);
let geo = await response.json();

let centerpoint = geo.results[0].geometry.location; 

Tiếp theo, tôi mở trình duyệt và điều hướng đến URL Google Maps:

// Search Google Maps for place category

let url = `https://www.google.com/maps/search/pizza+in+Chicago/@${centerpoint.lat},${centerpoint.lng}`;

await page.goto(url); 

Sau đó, tôi trích xuất các địa điểm từ kết quả được hiển thị và phân trang nếu cần:

// Extract place data

let places = await page.evaluate(() => {

  let results = [];

  // Logic to parse DOM and extract place data

  return results; 

});

// Click "Next" to paginate
await page.click(‘button[aria-label="Next page"]‘);

Tôi liên tục loại bỏ các trang bổ sung và mức thu phóng cho đến khi có được tất cả kết quả.

Như bạn có thể thấy, điều này đòi hỏi phải thiết kế ngược mã giao diện người dùng một cách tỉ mỉ. Nhưng phần thưởng là quyền truy cập vào cơ sở dữ liệu địa điểm đầy đủ của Google.

Tôi đã có thể trích xuất hơn 500,000 địa điểm trên khắp California bằng cách sử dụng loại máy cạo tùy chỉnh này. Việc này tốn nhiều công sức nhưng có thể cung cấp bộ dữ liệu khổng lồ.

Cạo Gotchas

Dưới đây là một số mẹo khi cạo Google Maps:

  • Sử dụng Puppeteer trong Node hoặc Selenium trong Python để tự động hóa trình duyệt.

  • Thực hiện độ trễ ngẫu nhiên giữa các hành động để xuất hiện "con người".

  • Xoay proxy và tiêu đề giả mạo để tránh bị phát hiện bot.

  • Cạo tăng dần và duy trì trạng thái để tiếp tục.

  • Song song trên các trình duyệt để có kết quả nhanh hơn.

Quét web có thể mở khóa các bộ dữ liệu về địa điểm khổng lồ nhưng cũng đi kèm với những thách thức lớn. Việc sử dụng API nói chung là sạch hơn… điều này đưa chúng ta đến chiến lược thứ tư.

Phương pháp 4: Tận dụng API địa điểm của bên thứ ba

Nhiều công ty cung cấp cơ sở dữ liệu về địa điểm thay thế với phạm vi bao phủ rộng hơn cơ sở dữ liệu của Google.

Ví dụ:

  • Thực tế có dữ liệu về hơn 100 triệu POI toàn cầu có nguồn gốc từ nhiều nhà cung cấp khác nhau, bao gồm cả Google.

  • bốn ô vuông có hơn 105 triệu vị trí trong API nhà phát triển của họ.

  • Kêu ẳng ẳng có dữ liệu về hàng triệu doanh nghiệp địa phương thông qua Fusion API của họ.

  • GeoNames có cơ sở dữ liệu mở với hơn 25 triệu đặc điểm địa lý.

Tất cả những thứ này có thể bổ sung cho Google Địa điểm bằng cách cung cấp bộ dữ liệu lớn hơn.

Gần đây tôi đã tích hợp Factual vào một dự án để trích xuất hàng loạt địa điểm ưa thích trên khắp Nhật Bản – hơn 5 triệu địa điểm! Vượt xa giới hạn của Google.

Nhược điểm là mã hóa và trả tiền cho một dịch vụ khác. Nhưng đối với một số trường hợp sử dụng nhất định, dữ liệu của bên thứ ba có thể là lựa chọn tốt nhất của bạn cho số lượng lớn địa điểm.

Phương pháp nào là tốt nhất cho bạn?

Vậy bạn nên sử dụng phương pháp nào để trích xuất hàng triệu địa điểm từ Google? Nó phụ thuộc!

Đây là quy tắc chung của tôi:

  • Sự đánh số trang – Dành cho tối đa vài nghìn địa điểm bổ sung.

  • Tìm kiếm lưới – Lên tới hàng trăm ngàn địa điểm.

  • Rút trích nội dung trang web – Hàng triệu địa điểm nhưng thách thức về mặt kỹ thuật.

  • API bên ngoài – Mấy chục triệu chỗ nhưng cộng thêm chi phí.

Ngoài ra, hãy xem xét mức độ khẩn cấp mà bạn cần dữ liệu và những thuộc tính địa điểm cụ thể mà bạn yêu cầu.

Tôi thấy hầu hết các dự án đều phù hợp với tìm kiếm dạng lưới để có hiệu suất tối ưu và sự đơn giản. Nhưng hãy khám phá tất cả các lựa chọn – bạn có nhiều sự lựa chọn!

Và các phương pháp kết hợp thường là mạnh mẽ nhất, như lưới + thu thập thông tin hoặc API thực tế + Google Địa điểm.

Các giới hạn này không phù hợp với tham vọng khao khát dữ liệu của bạn.

Những bài học chính và các bước tiếp theo

Hãy tóm tắt lại những gì chúng ta đã học được:

  • API Google Địa điểm giới hạn bạn ở 120 địa điểm cho mỗi truy vấn… nhưng nhiều ứng dụng cần nhiều dữ liệu hơn.

  • Các kỹ thuật như phân trang, tìm kiếm dạng lưới và quét web có thể truy xuất hàng triệu địa điểm từ Google.

  • API địa điểm của bên thứ ba cũng cung cấp dữ liệu phong phú hơn.

  • Hãy cân nhắc việc kết hợp các phương pháp khác nhau như lưới + quét để có kết quả tối ưu.

Bây giờ bạn đã có hướng dẫn của chuyên gia để vượt qua giới hạn của Google. Thế giới dữ liệu về địa điểm là của bạn để khám phá.

Tiếp theo, dành chút thời gian chọn phương pháp phù hợp nhất với trường hợp sử dụng của bạn và bắt đầu triển khai giải pháp.

Hãy liên hệ nếu bạn có bất kỳ câu hỏi nào khác! Tôi luôn sẵn lòng giúp đỡ những người đam mê dữ liệu địa lý.

Bây giờ, hãy giải phóng toàn bộ tiềm năng của dữ liệu địa điểm để hỗ trợ dự án lập bản đồ tiếp theo của bạn!

Tham gia vào cuộc đối thoại

Chúng tôi sẽ không công khai email của bạn. Các ô đánh dấu * là bắt buộc *