python爬蟲獲取小區(qū)經(jīng)緯度以及結(jié)構(gòu)化地址
本文實例為大家分享了python爬蟲獲取小區(qū)經(jīng)緯度、地址的具體代碼,供大家參考,具體內(nèi)容如下
通過小區(qū)名稱利用百度api可以獲取小區(qū)的地址以及經(jīng)緯度,但是由于api返回的值中的地址形式不同,所以可以首先利用小區(qū)名稱進行一輪爬蟲,獲取小區(qū)的經(jīng)緯度,然后再利用經(jīng)緯度Reverse到小區(qū)的結(jié)構(gòu)化的地址。另外小區(qū)名稱如果是'...號‘,可以在爬蟲開始之前在'號‘之后加一個'院‘,得到的精確度更高。這次寫到程序更加便于二次利用,只需要給程序傳遞一個dataframe就可以坐等結(jié)果了?,F(xiàn)在程序已經(jīng)寫好了,就等接下來在工作中看看效果如何了。
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__['小區(qū)經(jīng)度'] = np.nan
self.__data__['小區(qū)緯度'] = np.nan
self.__data__['小區(qū)地址'] = np.nan
for i in self.__data__.index:
self.__data__.loc[i,'小區(qū)緯度'],self.__data__.loc[i,'小區(qū)經(jīng)度'],self.__data__.loc[i,'小區(qū)地址'] =\
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('住宅區(qū)')
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 ('小區(qū)緯度' in data.columns) and ('小區(qū)經(jīng)度' 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__['小區(qū)緯度'].apply(self.__to_string__)+','\
+self.__data__['小區(qū)經(jīng)度'].apply(self.__to_string__)+base_url3+my_ak
return url
def get_address(self):
url = self.__get_address2__()
self.__data__['小區(qū)地址'] = url.apply(self.__get_address1__)
return self.__data__
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
PyTorch中flatten()?函數(shù)的用法實例小結(jié)
在PyTorch中,flatten函數(shù)的作用是將一個多維的張量轉(zhuǎn)換為一維的向量,它可以將任意形狀的張量轉(zhuǎn)換為一維,而不需要指定轉(zhuǎn)換后的大小,這篇文章主要介紹了PyTorch中flatten()?函數(shù)的用法,需要的朋友可以參考下2023-11-11
在Python中字典根據(jù)多項規(guī)則排序的方法
今天小編就為大家分享一篇在Python中字典根據(jù)多項規(guī)則排序的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01
Python實現(xiàn)輕松合并doc為txt的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用Python編程語言和wxPython模塊,打開指定文件夾中的DOC文檔,并將它們的內(nèi)容合并成一個便捷的TXT文檔,需要的可以參考下2024-03-03
Python socket如何實現(xiàn)服務(wù)端和客戶端數(shù)據(jù)傳輸(TCP)
這篇文章主要介紹了Python socket如何實現(xiàn)服務(wù)端和客戶端數(shù)據(jù)傳輸(TCP),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05
使用Python的urllib和urllib2模塊制作爬蟲的實例教程
這篇文章主要介紹了使用Python的urllib和urllib2模塊制作爬蟲的實例教程,展現(xiàn)了這兩個常用爬蟲制作模塊的基本用法,極度推薦!需要的朋友可以參考下2016-01-01

