如何用Python提交表单获取预期结果?地理位置数据获取遇阻
解决无法从findlatitudeandlongitude.com获取地理位置数据的问题
我来帮你捋捋这个问题的症结,还有可行的解决办法:
问题根源
你用requests直接发起GET/POST请求拿不到数据,主要有两个核心原因:
- 动态数据渲染:这个网站的经纬度结果是通过JavaScript动态加载的,你用
requests拿到的只是静态HTML骨架,还没等到页面渲染出实际的地理位置数据。 - 请求验证拦截:网站可能会检查请求头(比如是否有合法的
User-Agent)、Cookie等信息,直接用requests默认的请求头容易被识别为非浏览器请求,导致返回内容不完整。
解决方案1:用Selenium模拟浏览器(新手友好,直观可靠)
Selenium可以模拟真实浏览器的操作流程,等待页面完全加载后再提取数据,完美解决动态渲染的问题。
示例代码:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化Chrome浏览器(需提前安装对应版本的ChromeDriver) driver = webdriver.Chrome() try: # 打开目标网站 driver.get('https://www.findlatitudeandlongitude.com/') # 定位地址输入框并输入目标地址 address_input = driver.find_element(By.ID, 'address') address_input.send_keys('你要查询的具体地址') # 点击搜索按钮 search_btn = driver.find_element(By.ID, 'btnfind') search_btn.click() # 等待结果加载完成,提取经纬度 wait = WebDriverWait(driver, 10) latitude = wait.until(EC.presence_of_element_located((By.ID, 'latitude'))).get_attribute('value') longitude = wait.until(EC.presence_of_element_located((By.ID, 'longitude'))).get_attribute('value') print(f"查询到的纬度: {latitude}, 经度: {longitude}") finally: # 关闭浏览器 driver.quit()
注意:需要先安装Selenium(
pip install selenium),并下载对应浏览器版本的驱动(比如ChromeDriver)放在环境变量可访问的路径里。
解决方案2:抓包获取真实API接口(更高效,无需浏览器)
如果你不想用浏览器模拟,可以通过浏览器开发者工具抓包,找到网站实际请求的API接口,直接调用这个接口拿数据:
- 打开浏览器F12进入开发者工具,切换到「Network」标签;
- 在网站输入地址并点击搜索,观察XHR/fetch类型的请求,找到返回经纬度的接口;
- 复制该接口的URL、请求头、请求参数,用
requests直接调用。
示例代码(以抓包到的接口为例,实际需以你抓包结果为准):
import requests # 从抓包结果里复制完整的请求头,至少要包含User-Agent headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Referer': 'https://www.findlatitudeandlongitude.com/', # 若需要Cookie也一并复制 } # 抓包到的请求参数 data = { 'address': '你要查询的具体地址', # 其他可能的参数比如token,从抓包的Form Data里复制 } # 替换成你抓包到的真实API地址 api_url = 'https://www.findlatitudeandlongitude.com/实际的API接口路径' response = requests.post(api_url, headers=headers, data=data) # 解析JSON结果 result = response.json() print(f"纬度: {result['latitude']}, 经度: {result['longitude']}")
额外提示
- 无论用哪种方法,都要遵守网站的
robots.txt规则,不要频繁请求,避免IP被封禁; - 如果你只是需要地址转经纬度的功能,也可以考虑使用更稳定的第三方地理编码API(比如国内的高德、百度地图API,需要申请密钥,但数据可靠性更高)。
内容的提问来源于stack exchange,提问作者user9463814
相关产品推荐
相关产品推荐

