Я хочу преобразовать список почтовых индексов в DataFrame широты и долготы, используя данные с этого веб-сайта: Бесплатные инструменты карты.
https://www.freemaptools.com/convert-us-zip-code-to-lat-lng.htm#google_vignette
Вот мой код, но он не возвращает данные о широте и долготе. Как я могу его улучшить?
import requests
from bs4 import BeautifulSoup
def get_lat_lng(zip_code):
# URL of the form processing page
url = 'https://www.freemaptools.com/convert-us-zip-code-to-lat-lng.htm'
# Create a session to handle cookies and headers
session = requests.Session()
# Send a GET request to get the initial form and any hidden data
response = session.get(url)
response.raise_for_status()
# Parse the page with BeautifulSoup
soup = BeautifulSoup(response.text, 'html.parser')
# Find form data (if needed)
# Note: The actual form data extraction depends on how the website is structured
# For simplicity, assume there's no hidden form data to worry about
# Prepare the data to send in the POST request
data = {
'zip': zip_code
# Include any other required form fields here if necessary
}
# Send a POST request with the zip code data
response = session.post(url, data=data)
response.raise_for_status()
# Parse the resulting page
soup = BeautifulSoup(response.text, 'html.parser')
# Extract latitude and longitude (you need to adjust these selectors based on the website's structure)
lat = soup.find('span', {'id': 'latitude'}).text.strip()
lng = soup.find('span', {'id': 'longitude'}).text.strip()
return lat, lng
# Example
zip_code = ['97048','63640','63628']
latitude, longitude = get_lat_lng(zip_code)
print(f'Latitude: {latitude}, Longitude: {longitude}')
запросите данные о широте и долготе из https://www.freemaptools.com/convert-us-zip-code-to-lat-lng.htm#google_vignette
Запрос списка почтовых индексов, т.е. ['97048','63640','63628'] и получите широту и долготу для каждого почтового индекса.
Это приводит к сообщению об ошибке.
Кажется, я не могу найти исходный источник данных.
Быстро погуглив, я нашел на нашем родственном сайте: gis.stackexchange.com/questions/5114/… , а также gist.github.com/erichurst/7882666 (который подсказывает, где найти источники) . В следующий раз постарайтесь тщательнее искать данные.
Значения широты и долготы с предоставленного вами сайта в порядке, но их значения сильно отличаются от тех, которые я ищу. В любом случае, спасибо.
Пытаться:
import requests
api_url = (
"https://api.promaptools.com/service/us/zip-lat-lng/get/?zip = {}&key=17o8dysaCDrgvlc"
)
zips = ["97048", "63640", "63628"]
headers = {
"Origin": "https://www.freemaptools.com",
}
for z in zips:
url = api_url.format(z)
data = requests.get(url, headers=headers).json()
print(z, data)
Распечатки:
97048 {'status': 1, 'output': [{'zip': '97048', 'latitude': '46.053228', 'longitude': '-122.971330'}]}
63640 {'status': 1, 'output': [{'zip': '63640', 'latitude': '37.747435', 'longitude': '-90.363484'}]}
63628 {'status': 1, 'output': [{'zip': '63628', 'latitude': '37.942778', 'longitude': '-90.484430'}]}
Ваш код работает для меня.
Почему? Вы посмотрели, предоставляют ли они исходные данные или ссылаются на исходные данные? Постарайтесь не удалять данные, если вы можете получить данные (и, судя по названию веб-сайта, я предполагаю, что они просто объединяют данные, которые легко нашли в Интернете).