使用python爬虫高德地图并数据可视化分析全国地铁
时间: 2023-11-11 18:06:11 浏览: 149
爬取高德地图数据可以使用`requests`库和`BeautifulSoup`库。首先,需要获取全国地铁列表页面的HTML内容。可以通过以下代码实现:
```python
import requests
from bs4 import BeautifulSoup
url = 'https://ditie.mapbar.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
```
接下来,需要从HTML中提取地铁信息。可以通过观察HTML源代码,发现地铁信息保存在`<div class="subway_list">`标签下的`<a>`标签中。可以使用以下代码提取地铁名称和链接:
```python
subway_list = soup.find('div', {'class': 'subway_list'})
subways = subway_list.find_all('a')
subway_info = []
for subway in subways:
name = subway.text
link = subway['href']
subway_info.append({'name': name, 'link': link})
```
接下来,需要访问每个地铁线路的页面获取地铁站点信息。可以使用以下代码实现:
```python
for subway in subway_info:
link = subway['link']
response = requests.get(link)
soup = BeautifulSoup(response.text, 'html.parser')
station_list = soup.find('div', {'class': 'station_list'})
stations = station_list.find_all('a')
station_info = []
for station in stations:
name = station.text
lat = station['lat']
lng = station['lng']
station_info.append({'name': name, 'lat': lat, 'lng': lng})
subway['stations'] = station_info
```
现在,`subway_info`列表就包含了全国所有地铁线路的信息,每个地铁线路包含它所包含的地铁站点信息。可以将这些信息写入CSV文件中:
```python
import csv
with open('subway.csv', 'w', newline='', encoding='utf-8') as csvfile:
fieldnames = ['subway', 'station', 'lat', 'lng']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for subway in subway_info:
for station in subway['stations']:
writer.writerow({
'subway': subway['name'],
'station': station['name'],
'lat': station['lat'],
'lng': station['lng']
})
```
数据可视化可以使用`matplotlib`库和`pandas`库。可以使用以下代码读取CSV文件并创建一个包含所有地铁站点信息的数据框:
```python
import pandas as pd
df = pd.read_csv('subway.csv')
```
接下来,可以使用以下代码绘制全国地铁站点分布图:
```python
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 8))
plt.scatter(df['lng'], df['lat'], s=2, alpha=0.5)
plt.title('Subway stations in China')
plt.xlabel('Longitude')
plt.ylabel('Latitude')
plt.show()
```
可以在地图上看到所有地铁站点的分布情况。如果想要根据地铁线路对站点进行着色,可以使用以下代码:
```python
import matplotlib.cm as cm
colors = cm.rainbow(df['subway'].factorize()[0] / len(df['subway'].unique()))
plt.figure(figsize=(10, 8))
plt.scatter(df['lng'], df['lat'], s=2, alpha=0.5, c=colors)
plt.title('Subway stations in China')
plt.xlabel('Longitude')
plt.ylabel('Latitude')
plt.show()
```
这样可以看到每个地铁线路的站点都被着不同的颜色。
阅读全文