Python3爬取OpenStreetMap平台的城市道路交通网数据

Python3 爬取OpenStreetMap平台的城市道路交通网数据

前言

论文需要城市道路信息数据,OpenStreetMap平台是一个开源免费的全球地图信息平台,但是对于中国地图信息收录不是很全。我们可以通过API进行获取指定城市的交通道路信息。实验代码在Python3环境中跑,开放环境是Jupyter。

思路

首先获取城市ID,将城市ID进行转换成10位字符串,传递处理后的城市ID生成OSM文件。这里有关键的两个数据包
1、获取城市ID

<osm-script>
    <query type="relation">
        <has-kv k="boundary" v="administrative"/>
        <has-kv k="name:zh" v="合肥市"/>
    </query>
    <print/>
</osm-script>

2、获取道路信息

<osm-script timeout="1800" element-limit="100000000">
  <union>
    <area-query ref="10位的城市id"/>
    <recurse type="node-relation" into="rels"/>
    <recurse type="node-way"/>
    <recurse type="way-relation"/>
  </union>
  <union>
    <item/>
    <recurse type="way-node"/>
  </union>
  <print mode="body"/>
</osm-script>

代码

import requests
import re

def getCityRpadDataByOSM(cityName):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36",
        "Content-Type": "application/x-www-form-urlencoded"
    }
    data = '<osm-script><query type="relation"><has-kv k="boundary" v="administrative"/><has-kv k="name:zh" v="'+cityName+'"/></query><print/></osm-script>'
    url = "http://www.overpass-api.de/api/interpreter"
    response = requests.post(url, data = data.encode(), headers = headers)
    # 利用正则表达式提取 id
    match = re.search('<relation id="(.*?)">',response.text)
    id = match.group(1)
    # id 需要 10位
    if id:
        id = str(3600000000+int(id))
        print(id)
    else:
        return
    data2 = '<osm-script timeout="1800" element-limit="100000000"><union><area-query ref="'+id+'"/><recurse type="node-relation" into="rels"/><recurse type="node-way"/><recurse type="way-relation"/></union><union><item/><recurse type="way-node"/></union><print mode="body"/></osm-script>'
    response2 = requests.post(url, data = data2, headers = headers)
    if len(response2.text)>1000:
    # 这里设置阀值是因为 网络问题会导致出现超时,丢掉这个包
        with open(cityName+".osm","w",encoding='utf-8') as f:
            f.write(response2.text)

getCityRpadDataByOSM("合肥市")

效果

根据代码会打印 3603288965,这是转换后的10位合肥城市ID
生成的“合肥市.osm”文件如果打开有timeout英文,说明是网络问题你超时了,你可以多试几次,最后成功的文件是这样的:
在这里插入图片描述

结语

参考博客:
利用OpenStreetMap获取城市路网数据
后面呢是需要提取XML数据中的信息,比如Node标签和Way标签中的信息,这个后面再记录,如果有需要可以评论,然后我把代码发出来。

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
爬取北京市安居客新房房价数据可以分为以下几个步骤: 1. 确定爬取目标:在安居客网站上选择北京市的新房板块。 2. 分析网页结构:使用浏览器开发者工具查看网页结构,确定需要爬取数据所在的 HTML 标签和 CSS 类名或 ID。 3. 使用 Python 爬取数据:使用 requests 库发送 HTTP 请求,获得网页 HTML 代码;使用 Beautiful Soup 库解析 HTML 代码,提取需要的数据。 4. 存储数据:将爬取到的数据存储到本地文件或数据库中。 下面是一个简单的 Python 爬取北京市安居客新房房价数据的示例代码: ```python import requests from bs4 import BeautifulSoup # 爬取目标页面的 URL url = 'https://beijing.anjuke.com/sale/' # 发送 HTTP 请求,获取网页 HTML 代码 response = requests.get(url) html = response.text # 使用 Beautiful Soup 解析 HTML 代码,提取需要的数据 soup = BeautifulSoup(html, 'html.parser') house_list = soup.find_all('li', class_='list-item') # 打印房价数据 for house in house_list: name = house.find('div', class_='house-title').a.text.strip() price = house.find('span', class_='price-det').text.strip() print(name, price) # 存储数据到本地文件 with open('house_prices.txt', 'w', encoding='utf-8') as f: for house in house_list: name = house.find('div', class_='house-title').a.text.strip() price = house.find('span', class_='price-det').text.strip() f.write(name + '\t' + price + '\n') ``` 该示例代码爬取北京市安居客新房板块的房价数据,并将数据打印到控制台和存储到本地文件中。你可以根据自己的需求修改代码,爬取更多的数据,并进行数据分析和可视化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江湖人称王某人的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值