python爬虫获取小区经纬度以及结构化地址
本文实例为大家分享了python爬虫获取小区经纬度、地址的具体代码,供大家参考,具体内容如下
通过小区名称利用百度api可以获取小区的地址以及经纬度,但是由于api返回的值中的地址形式不同,所以可以首先利用小区名称进行一轮爬虫,获取小区的经纬度,然后再利用经纬度Reverse到小区的结构化的地址。另外小区名称如果是'...号‘,可以在爬虫开始之前在'号‘之后加一个'院‘,得到的精确度更高。这次写到程序更加便于二次利用,只需要给程序传递一个dataframe就可以坐等结果了。现在程序已经写好了,就等接下来在工作中看看效果如何了。
classGetAddressInfo: def__init__(self,df): importpandas asserttype(df)==pandas.core.frame.DataFrameand('city'indf.columns)and('name'indf.columns),\ 'Thedataframeisnotvailid' frombs4importBeautifulSoup fromurllibimportrequest importre importpandasaspd importnumpyasnp importurllib.parseasurp self.__data__=df defget_address(self): importnumpyasnp self.__data__['小区经度']=np.nan self.__data__['小区纬度']=np.nan self.__data__['小区地址']=np.nan foriinself.__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']) returnself.__data__ def__lat__(self,res): try: returnpd.to_numeric(re.findall('"lat":(.*)',res)[0].split(',')[0]) except: return0 def__lng__(self,res): try: returnpd.to_numeric(re.findall('"lng":(.*)',res)[0]) except: return0 def__address__(self,res): try: returnre.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) returnlat,lng,address except: return0,0,'None' classReverseGetAddress: def__init__(self,data): assert('小区纬度'indata.columns)and('小区经度'indata.columns)and('name'indata.columns),\ 'TheDataFrameisnotvailid' frombs4importBeautifulSoup fromurllibimportrequest importre importpandasaspd importnumpyasnp importurllib.parseasurp self.__data__=data def__get_address1__(self,url): try: req=request.urlopen(url) res=req.read().decode() address=re.findall('address":"(.*?)"',res)[0] returnaddress except: return'None1' def__to_string__(self,arr): returnstr(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 returnurl defget_address(self): url=self.__get_address2__() self.__data__['小区地址']=url.apply(self.__get_address1__) returnself.__data__
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。