Python爬虫实现小区经纬度与结构化地址批量获取
本文介绍如何使用Python爬虫结合百度地图API,通过小区名称获取经纬度,再反向解析为结构化地址。代码支持传入DataFrame批量处理,并优化了含“号”的小区名称精度,提高数据获取效率。
本文分享了一个使用Python爬虫获取小区经纬度及地址信息的完整代码示例,供读者参考学习。
利用百度地图API,可以通过小区名称直接获取其地址和经纬度信息。然而,由于API返回的地址格式存在差异,建议采用两步策略:首先通过小区名称进行初步爬虫,获取小区的经纬度坐标;随后利用这些经纬度进行反向地理编码(Reverse Geocoding),从而获得更结构化的小区地址。此外,若小区名称中包含“...号”格式,建议在爬虫开始前在“号”字后追加“院”字,这样能显著提升结果的精确度。当前程序已封装为类,只需传入包含城市(city)和小区名称(name)列的DataFrame即可自动处理并返回结果,便于后续工作中的应用与二次开发。目前代码已编写完成,后续将在实际工作中验证效果。
class GetAddressInfo:
def __init__(self,df):
import pandas
assert type(df) == pandas.core.frame.DataFrame and ('city' in df.columns) and ('name' in df.columns),\
'The dataframe is not vailid'
from bs4 import BeautifulSoup
from urllib import request
import re
import pandas as pd
import numpy as np
import urllib.parse as urp
self.__data__ = df
def get_address(self):
import numpy as np
self.__data__['小区经度'] = np.nan
self.__data__['小区纬度'] = np.nan
self.__data__['小区地址'] = np.nan
for i in self.__data__.index:
self.__data__.loc[i,'小区纬度'],self.__data__.loc[i,'小区经度'],self.__data__.loc[i,'小区地址'] =\
self.__get_neigbour_address__(self.__data__.loc[i,'name'],\
self.__data__.loc[i,'city'])
return self.__data__
def __lat__(self,res):
try:
return pd.to_numeric(re.findall('"lat":(.*)',res)[0].split(',')[0])
except:
return 0
def __lng__(self,res):
try:
return pd.to_numeric(re.findall('"lng":(.*)',res)[0])
except:
return 0
def __address__(self,res):
try:
return re.findall('"address":"(.*)",',res)[0]
except:
return 'None'
def __get_neigbour_address__(self,name,city):
my_ak = ##替换自己的ak
qurey = urp.quote(name)
tag = urp.quote('住宅区')
try:
url = 'http://api.map.baidu.com/place/v2/search?query='+qurey+'&tag='+tag+'®ion='+urp.quote(city)+'&output=json&ak='+my_ak
req = request.urlopen(url)
res = req.read().decode()
lat = self.__lat__(res)
lng = self.__lng__(res)
address = self.__address__(res)
return lat,lng,address
except:
return 0,0,'None'
class ReverseGetAddress:
def __init__(self,data):
assert ('小区纬度' in data.columns) and ('小区经度' in data.columns) and ('name' in data.columns),\
'The DataFrame is not vailid'
from bs4 import BeautifulSoup
from urllib import request
import re
import pandas as pd
import numpy as np
import urllib.parse as urp
self.__data__ = data
def __get_address1__(self,url):
try:
req = request.urlopen(url)
res = req.read().decode()
address = re.findall('address":"(.*?)"',res)[0]
return address
except:
return 'None1'
def __to_string__(self,arr):
return str(arr)
def __get_address2__(self):
my_ak = ##替换自己的Ak
base_url1 = 'http://api.map.baidu.com/geocoder/v2/?callback=renderReverse'
base_url2 = '&location='
base_url3 = '&pois=0&radius=1&output=json&pois=1&ak='
url = base_url1+base_url2+self.__data__['小区纬度'].apply(self.__to_string__)+','\
+self.__data__['小区经度'].apply(self.__to_string__)+base_url3+my_ak
return url
def get_address(self):
url = self.__get_address2__()
self.__data__['小区地址'] = url.apply(self.__get_address1__)
return self.__data__
以上就是本文的全部内容,希望能为读者的学习提供有益帮助,也欢迎大家继续支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









