python最难的地方在哪_Python告诉你今天最冷的地方在哪里

01抓取目标

这次我们的目标是爬取全国最冷的 10 座城市。

首先打开目标网站 - 中国天气网。

「http://www.weather.com.cn/textFC/hb.shtml」

我们要爬取全国所有城市的 温度,然后获取温度最低的 10 个城市,再绘制成饼状图。02准备工作

由于爬取的数据少,考虑使用「美味汤 - beautiful soup」的方式来爬取。

另外,最后需要根据数据生成饼状图,需要安装「pyecharts」及兼容库,不然控制台会报错。# 安装美味汤

pip3 install bs4

# html5lib 提升兼容性

pip3 install html5lib

# 安装图形库

pip3 install pyecharts

# 安装图形兼容库

pip3 install pyecharts-snapshot

注意:一般爬虫使用 lxml 去解析,但是由于中国天气网的「港澳台」页面源码中存在很多标签没有正确关闭,因此使用html5lib的方式去解析数据。

03爬取思路

首先,我们可以看到全国分为华北、东北、华东、华中、华南、西北、西南、港澳台,8 个区域来展示天气数据。# 一共8个区域,包含:华北、东北、华东、华中、华南、西北、西南、港澳台

# 华北

url_hb = 'http://www.weather.com.cn/textFC/hb.shtml'

# 东北

url_db = 'http://www.weather.com.cn/textFC/db.shtml'

# 华东

url_hd = 'http://www.weather.com.cn/textFC/hd.shtml'

# 华中

url_hz = 'http://www.weather.com.cn/textFC/hz.shtml'

# 华南

url_hn = 'http://www.weather.com.cn/textFC/hn.shtml'

# 西北

url_xb = 'http://www.weather.com.cn/textFC/xb.shtml'

# 西南

url_xn = 'http://www.weather.com.cn/textFC/xn.shtml'

# 港澳台【比较特殊】

url_gat = 'http://www.weather.com.cn/textFC/gat.shtml'

我们首先需要去获取每一个区域下所有城市的天气数据,然后再对数据进行整理排序,写入到图形文件中。04代码实现

首先爬取「华北地区」城市的天气数据。

可以获取到下面的规律:

所有的「class=conMidtab」的 6 个 div 保存着华北地区所有城市,包含今天以内未来一周的天气数据。

每一个「class=conMidtab2」的 div 代表了一个省份的天气信息。

省份下面的城市天气数据,都包含 table 标签下。从第 3 个 tr 标签开始,是每一个城市的天气数据。

soup = BeautifulSoup(text, 'html5lib')

div_conMidtab = soup.find('div', class_='conMidtab')

# 3.获取所有的table子Tag【天气信息都保存在table标签下面】

tables = div_conMidtab.find_all('table')

# 4.遍历片区下面的省份

for table in tables:

# 4.1过滤掉表头的两个tr数据

trs = table.find_all('tr')[2:]

# 5.遍历省份下面的市区

for index, tr in enumerate(trs):

tds= tr.find_all('td')

# 5.1 城市名称【第 1 个td标签】

# 注意:一个省份第一个城市取第 2 个td标签;其余城市取第 1 个td标签

city_td = tds[1] if index == 0 else tds[0]

city = list(city_td.stripped_strings)[0]

# 5.2 最低气温【倒数第 2 个td标签】

temp_low_td = tds[-2]

temp_low = list(temp_low_td.stripped_strings)[0]

ALL_DATA.append({'city': city, 'temp_low': int(temp_low)})

接下来,循环全国 8 个区域的列表,获取所有城市的名称和温度数据。for index, url in enumerate(url_areas):

print('开始爬取第{}个区域'.format(index + 1))

parse_page(url)

time.sleep(1)

然后拿到所有城市和温度的列表数据后,就可以对数据按温度进行「升序」排列。def analysis_data():

'''

分析爬下来的数据

:return:

'''

# 1.默认的排序方式是升序【通过最低气温进行排序】

ALL_DATA.sort(key=lambda data: data['temp_low'])

# 2.获取前面10条数据

top_10 = ALL_DATA[:10]

return top_10

最后,将数据写入到饼状图中。def show_with_chart(top_10):

'''

10个城市和温度生成饼状图

:param top_10:

:return:

'''

# 把列表tip_10中的每一项拿出去放到匿名函数中,然后组装成新的一个列表

# 1.获取城市列表

citys = list(map(lambda item: item['city'], top_10))

# 2.最低温度列表

temp_lows = list(map(lambda item: item['temp_low'], top_10))

# 3.生成饼状图并写入到html文件中

bar = Bar('最低气温排行榜')

bar.add('最低温度', citys, temp_lows)

# 渲染

bar.render('temperature.html')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值