Web 从在线交互式地图中抓取基础数据
Web Scraping Underlying Data from Online Interactive Map
我正在尝试从本网站的交互式地图中获取基础数据:https://www.sabrahealth.com/properties
我尝试使用 Google Chrome 上的检查功能来查找 XHR 文件,该文件将保存地图上所有点的位置,但没有出现。有其他方法可以从此地图中提取位置数据吗?
好吧,位置数据可以在他们的网站上下载 here。但假设您需要实际的纬度、经度值来进行一些分析。
我要做的第一件事就是您所做的(寻找 XHR)。如果在那里找不到任何东西,我通常做的第二件事就是在 html 中搜索 <script>
标签。有时数据是 "hiding" 在那里。这需要更多的侦探工作。它并不总是会产生结果,但在这种情况下会产生结果。
如果您查看 <script>
标签,您会找到相关的 json 格式。然后你就可以使用它了。只需找到它然后处理字符串以获得有效的 json 格式,然后使用 json.loads()
将其输入即可。
import requests
import bs4
import json
url = 'https://www.sabrahealth.com/properties'
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'}
response = requests.get(url, headers=headers)
soup = bs4.BeautifulSoup(response.text, 'html.parser')
scripts = soup.find_all('script')
for script in scripts:
if 'jQuery.extend(Drupal.settings,' in script.text:
jsonStr = script.text.split('jQuery.extend(Drupal.settings,')[1]
jsonStr = jsonStr.rsplit(');',1)[0]
jsonObj = json.loads(jsonStr)
for each in jsonObj['gmap']['auto1map']['markers']:
name = each['markername']
lat = each['latitude']
lon = each['longitude']
soup = bs4.BeautifulSoup(each['text'], 'html.parser')
prop_type = soup.find('i', {'class':'property-type'}).text.strip()
sub_cat = soup.find('span', {'class':'subcat'}).text.strip()
location = soup.find('span', {'class':'subcat'}).find_next('p').text.split('\n')[0]
print ('Type: %s\nSubCat: %s\nLat: %s\nLon: %s\nLocation: %s\n' %(prop_type, sub_cat, lat, lon, location))
输出:
Type: Senior Housing - Leased
SubCat: Assisted Living
Lat: 38.3309
Lon: -85.862521
Location: Floyds Knobs, Indiana
Type: Skilled Nursing/Transitional Care
SubCat: SNF
Lat: 29.719507
Lon: -99.06649
Location: Bandera, Texas
Type: Skilled Nursing/Transitional Care
SubCat: SNF
Lat: 37.189079
Lon: -77.376015
Location: Petersburg, Virginia
Type: Skilled Nursing/Transitional Care
SubCat: SNF
Lat: 37.759998
Lon: -122.254616
Location: Alameda, California
...
我正在尝试从本网站的交互式地图中获取基础数据:https://www.sabrahealth.com/properties
我尝试使用 Google Chrome 上的检查功能来查找 XHR 文件,该文件将保存地图上所有点的位置,但没有出现。有其他方法可以从此地图中提取位置数据吗?
好吧,位置数据可以在他们的网站上下载 here。但假设您需要实际的纬度、经度值来进行一些分析。
我要做的第一件事就是您所做的(寻找 XHR)。如果在那里找不到任何东西,我通常做的第二件事就是在 html 中搜索 <script>
标签。有时数据是 "hiding" 在那里。这需要更多的侦探工作。它并不总是会产生结果,但在这种情况下会产生结果。
如果您查看 <script>
标签,您会找到相关的 json 格式。然后你就可以使用它了。只需找到它然后处理字符串以获得有效的 json 格式,然后使用 json.loads()
将其输入即可。
import requests
import bs4
import json
url = 'https://www.sabrahealth.com/properties'
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'}
response = requests.get(url, headers=headers)
soup = bs4.BeautifulSoup(response.text, 'html.parser')
scripts = soup.find_all('script')
for script in scripts:
if 'jQuery.extend(Drupal.settings,' in script.text:
jsonStr = script.text.split('jQuery.extend(Drupal.settings,')[1]
jsonStr = jsonStr.rsplit(');',1)[0]
jsonObj = json.loads(jsonStr)
for each in jsonObj['gmap']['auto1map']['markers']:
name = each['markername']
lat = each['latitude']
lon = each['longitude']
soup = bs4.BeautifulSoup(each['text'], 'html.parser')
prop_type = soup.find('i', {'class':'property-type'}).text.strip()
sub_cat = soup.find('span', {'class':'subcat'}).text.strip()
location = soup.find('span', {'class':'subcat'}).find_next('p').text.split('\n')[0]
print ('Type: %s\nSubCat: %s\nLat: %s\nLon: %s\nLocation: %s\n' %(prop_type, sub_cat, lat, lon, location))
输出:
Type: Senior Housing - Leased
SubCat: Assisted Living
Lat: 38.3309
Lon: -85.862521
Location: Floyds Knobs, Indiana
Type: Skilled Nursing/Transitional Care
SubCat: SNF
Lat: 29.719507
Lon: -99.06649
Location: Bandera, Texas
Type: Skilled Nursing/Transitional Care
SubCat: SNF
Lat: 37.189079
Lon: -77.376015
Location: Petersburg, Virginia
Type: Skilled Nursing/Transitional Care
SubCat: SNF
Lat: 37.759998
Lon: -122.254616
Location: Alameda, California
...