【问题标题】:How to get latitude and longitude from an address scraping google maps?如何从抓取谷歌地图的地址中获取纬度和经度?
【发布时间】:2021-03-22 10:35:28
【问题描述】:

我正在尝试使用 get 请求获取地址的纬度和经度,但我遇到了困难。

地址由街道名称、数字和城市扇区组成。在本例中,街道名称为Hernando de Magallanes,编号为958,扇区为Las Condes。

我的代码如下:

import requests
from bs4 import BeautifulSoup as soup

url = "https://www.google.cl/maps/place/Hernando+de+Magallanes+958,+Las+Condes"
resp=requests.request(method="GET",url=url)

soup_parser = soup(resp.text, "html.parser")

我要找的部分在 script 下,在 hmtl 标签下。

html_content = soup_parser.html.contents[1]

_script = html_content.find_all("script")[7]

查看_script,有大量文本,但我正在寻找的部分是这里的https url:

.... uPfjZVD6AEAACAAAAADAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",null,null,[[[1,0]\n]\n,1,null,0,0]\n]\n,null,\"Hernando de Magallanes 958, Las Condes, Región Metropolitana\",null,null,\"https://www.google.cl/maps/preview/place/Hernando+de+Magallanes+958,+Las+Condes,+Regi%C3%B3n+Metropolitana/@-33.4164174,-70.5598746,3330a,13.1y/data\\u003d!4m2!3m1!1s0x9662ceef18131219:0x3bab969f4e95bd4e\",1,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1,null,null,null,null,null,null,null,0,[[[\"W2vSX-_FKMv39QOpipUw\",\"0ahUKEwiv3531h8TtAhXLe30KHSlFBQYQwlUIGCgAMAA\",[\"Hernando d ....

特别是,我正在寻找@ -> -33.4164174,-70.5598746 旁边的两个数字。

我怎样才能得到这个坐标?另外,我正在考虑为一堆其他地址执行此操作。此请求是否有每日配额?

【问题讨论】:

    标签: python-3.x web-scraping beautifulsoup


    【解决方案1】:

    使用正则表达式正则表达式re。并使用该模式。

    import requests
    from bs4 import BeautifulSoup as soup
    import re
    
    url = "https://www.google.cl/maps/place/Hernando+de+Magallanes+958,+Las+Condes"
    resp=requests.request(method="GET",url=url)
    
    soup_parser = soup(resp.text, "html.parser")
    
    html_content = soup_parser.html.contents[1]
    
    _script = html_content.find_all("script")[7]
    
    matches=re.findall("(-\d+\.\d{7})",_script.text)
    print(matches[0],matches[1])
    

    【讨论】:

      【解决方案2】:

      你需要查看页面的源代码并解析window.APP_INITIALIZATION_STATE变量块,在那里你会找到所有需要的数据。


      您也可以使用来自 SerpApi 的 Google Maps API。这是一个免费试用的付费 API。

      要集成的代码:

      import os
      from serpapi import GoogleSearch
      
      params = {
          "engine": "google_maps",
          "type": "search",
          "q": "Hernando de Magallanes 958 Las Condes",
          "ll": "@40.7455096,-74.0083012,14z",
          "google_domain": "google.com",
          "api_key": os.getenv("API_KEY"),
      }
      
      search = GoogleSearch(params)
      results = search.get_dict()
      
      coordinates = results["place_results"]["gps_coordinates"]
      latitude = coordinates['latitude']
      longitude = coordinates['longitude']
      
      print(f"Latitude: {latitude}\nLongitude: {longitude}")
      

      输出:

      Latitude: -33.4164174
      Longitude: -70.5598746
      

      免责声明,我为 SerpApi 工作。

      【讨论】:

        【解决方案3】:

        试试这个代码 sn-p 并相应地修改它? (不知道你的搜索条件和代码示例到底是什么,仅以此为例)。

        from requests import get
        from bs4 import BeautifulSoup
        
        headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36',}
        response = get("https://www.google.com/search?q=latitude+longitude+of+75270+postal+code+paris+france",headers=headers)
        soup = BeautifulSoup(response.text, 'html.parser')
        a = soup.find("div", class_= "Z0LcW").text
        print(a)
        

        输出:

        48.8573° N, 2.3370° E
        

        【讨论】:

        • 您好,感谢您的回答!我添加了地址和街道名称的一些详细信息。另外,添加了我正在使用的网址(我在写问题时忘记添加)。关于代码示例,我发布的几乎就是我现在所拥有的。我试图弄清楚如何获取所提到地址的纬度和经度,然后我想为其他地址复制相同的内容。
        猜你喜欢
        • 2012-09-28
        • 1970-01-01
        • 1970-01-01
        • 2013-07-13
        • 2014-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多