爬虫的基本使用
——以2019年全国大学生数学建模C题第二问为例
第二问是要自己去找某个城市的机场的情况,这里我做的是先用爬虫把成都双流机场的到达航班的数据爬下来,然后统计每个小时到达的航班数目,然后画出来bar图。
过程比较简单,主要是想记录一下爬虫爬下来之后应用BeautifulSoap的解析方法。
网站在这里:成都双流机场的航班信息
用的jupyter notebook写的。
一共有70页,观察网站的网址发现不同的页就是后面加了一个’&page=xxx’,循环搞定。
进入网站用F12打开开发者模式,在elements中找数据在哪里,发现了包含资源的最小的class,用这一句
letter_list = soup.find( attrs={'class':'arlineta departab'} ).find_all('tr')
获得其下的内容,是一个列表,把所有tr标签列出来。
然后再根据标签获得相应的信息
flight=tr.find_all('td')
代码在这里,可以直接运行:
#%%
# 第一部分,先准备好网址和headers
import requests
from bs4 import BeautifulSoup
website='http://www.cdairport.com/flightInfor.aspx?t=4&attribute=A&time=0'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
}
all_page=[]
for i in range(1,71):
if i==1:
all_page.append(website)
else:
all_page.append(website+'&page='+str(i))
#%%
# 爬取数据
flights=[]
for website in all_page:
r =requests.get(website,headers=headers)
soup = BeautifulSoup(r.text, 'lxml')
letter_list = soup.find( attrs={'class':'arlineta departab'} ).find_all('tr') #找到对应class下的所有tr标签
for i, tr in enumerate(letter_list):
if i!=0:
flight=tr.find_all('td') #tr标签下继续找td标签
dest=flight[1].get_text()# 看一下结构,到底要哪个,如果是要括号里的要用fligh.get['width']
time=flight[4].get_text()
flights.append((dest,time))
#%%
# 画图
import numpy as np
# 这里是去重,把同一个飞机但是不同航班的去掉
timetable = list(set(flights))
timetable.sort(key=flights.index) # 这个key是一个方法(函数),传入的参数是列表中的每个值,用来获取这个值对应的排位
sta=np.zeros((24))
for fl in timetable:
time=int(fl[1][0:2])
sta[time]+=1
import matplotlib.pyplot as plt
fig ,ax= plt.subplots(figsize=(14,7))
p1=ax.bar(x=np.arange(0,24),height=sta) # 这个是有一个返回值的,适用于在同一个ax上画了很多图的时候
xticklabels=[] # 设置x轴的标度
for i in range(24):
if i<10:
xticklabels.append('0'+str(i))
else:
xticklabels.append(str(i))
ax.set_xticks(np.arange(0,24))
ax.set_xticklabels(xticklabels)
ax.bar_label(p1,label_type='edge')#把数据显示出来
plt.show()
文章参考了这位博主的文章,写的很清楚。
但是爬的不是一个网站。