最近有个小伙伴想爬取国家宗教事务局官网上的宗教场所基本信息数据,今天就让我们一起来学习下这个数据的爬取,然后我们再根据地址变量使用高德地图和百度地图地理编码接口解析经纬度并绘制地图展示。
国家宗教事务局: https://www.sara.gov.cn/gjzjswj/zjjcxxcxxt/zjhdcsjbxx/index.shtml
这个网站上的数据是这样的:
![]()
是一个表格,进行网页分析可以发现这个表格数据可以使用如下 curl 语句请求到:
![]()
curl $'https://www.sara.gov.cn/eportal/ui?portal.url=/portlet/place-info-front\u0021queryList.portlet&moduleId=b68f71decbfb4ff4b274cac2bf67204b&pageId=614c812b4af64b4e91e31a7a7bc9f12a' \ |
我们可以把这个 curl 语句改写成 R 语言的,不过直接改写比较麻烦,可以使用这个网页工具:https://curlconverter.com/r/
![]()
# 这些代码大家需要根据从自己电脑上复制 curl 代码并转换 |
通过尝试我们可以发现 pageSize 参数直接改成 50000 就可以一次性请求到所有页面的数据了,这样就不用循环了。但是需要注意并非任何网站爬取都这样这样操作,有些网站会限制。
然后我们就可以使用 content() 函数提取 res 里面的数据了:
content(res, type = "text") %>% |
再整理下:
df %>% |
这样实际上我们就已经完成了这个数据爬取,不过下面我们还可以根据地址变量解析经纬度。
关于地址解析经纬度的方法建议大家学习下平台上的地理编码教程(平台上搜索“地理编码”即可找到)。
首先第一轮我们多线程使用高德地图进行地理编码:
# 解析经纬度 |
这里的 makeCluster(36) -> cl 是创建了 36 进程,这个进程数需要根据大家自己的电脑进行调整,可以使用 parallel::detectCores() 函数查看自己电脑的进程数。
然后我们筛选第一轮解析没有成功的进行第二轮解析,由于没成功的数量不多了,所以我们就直接用百度地图地理编码接口进行解析:
# 第二轮 |
最后还有一些没有成功的,我们单独处理下就行:
# 最后仍然失败的,单独处理下(百度下其他地址) |
合并所有成功的结果:
# 合并所有的结果 |
不过这样得到的数据是 GCJ02 坐标的,我们还需要转换成 WGS84 坐标才能使用:
source("GCJ02坐标转WGS84.R") |
有了经纬度就可以根据经纬度判断每个宗教场所所处的省市区县了:
# 根据经纬度判断所处的省市区县 |
这个时候实际上还可以继续检查下解析地址的准确性问题,不过这里因为时间的关系我们就不再继续检查了。
还可以保存成 dta 格式的:
df %>% |
最后我们再把这些经纬度坐标绘制到地图上:
# 绘图展示 |
![]()
这样我们就完成了这个任务。
点击这里跳转到 RStata 短书平台获取附件:使用 R 语言爬取宗教活动场所基本信息
评论