python爬虫:对全国城市温度进行爬取并可视化

it2024-11-17  4

python爬虫:对全国城市温度进行爬取并可视化

最近在学习爬虫和大数据,学习之余写了简单的demo,注释里面也说的很清楚,小白也都能看懂。如果有什么好的想法或者纠错之处希望能够评论区指出~ import requests from bs4 import BeautifulSoup from pyecharts.charts import Bar from pyecharts import options ALL_DATA = [] def parse_page(url): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36' } response = requests.get(url, headers=headers) # 这个加上了一个header就可以实现访问网页的身份以正常用户进行,如果不进行处理将会使用python身份 # 很多的网站会有反爬虫机制。短时间之内多次访问会造成禁止这个ip继续爬取数据 text = response.content.decode('utf-8') soup = BeautifulSoup(text, 'html5lib') # 这个解析器兼容较好,但是速度比较慢 conMidtab = soup.find('div', class_='conMidtab') tables = conMidtab.find_all('table') for table in tables: trs = table.find_all('tr')[2:] # 这个就是从而开始,把0,1忽略掉 # for tr in trs: # tds = tr.find_all('td') # city_td = tds[1] # 这里开头面对于一个省的第一个城市就会有问题,因为多了一个rowspan, # 但是如果对于直辖市还是取第一个td标签其实也是一样的,反而更加简单 # 所以这里做优化 for index, tr in enumerate(trs): # enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列, # 同时列出数据和数据下标,一般用在 for 循环当中 tds = tr.find_all('td') city_td = tds[0] if index == 0: city_td = tds[1] city = list(city_td.stripped_strings)[0] # 因为使用stripped_strings返回的是一个迭代器, # 所以这里要加上一个list()进行选取显示 temp_td = tds[-2] # 这个-2的意思是取tds标签里面的倒数第二个的意思!!!! min_temp = list(temp_td.stripped_strings)[0] #print({'city': city, 'min_temp': min_temp}) ALL_DATA.append({'city': city, 'min_temp': int(min_temp)}) def main(): url_hb = 'http://www.weather.com.cn/textFC/hb.shtml#' url_db = 'http://www.weather.com.cn/textFC/db.shtml' url_hn = 'http://www.weather.com.cn/textFC/hn.shtml' url_hz = 'http://www.weather.com.cn/textFC/hz.shtml' url_xn = 'http://www.weather.com.cn/textFC/xn.shtml' url_gat = 'http://www.weather.com.cn/textFC/gat.shtml' # 港澳台网页对lxml解析器就没法较好实现,使用html5lib url_xb = 'http://www.weather.com.cn/textFC/xb.shtml' urls = [ 'http://www.weather.com.cn/textFC/hb.shtml#', 'http://www.weather.com.cn/textFC/db.shtml', 'http://www.weather.com.cn/textFC/hn.shtml', 'http://www.weather.com.cn/textFC/hz.shtml', 'http://www.weather.com.cn/textFC/xn.shtml', 'http://www.weather.com.cn/textFC/gat.shtml', 'http://www.weather.com.cn/textFC/xb.shtml' ] # parse_page(url_hb) for url in urls: parse_page(url) # 分析数据 # 根据最低气温进行排序 ALL_DATA.sort(key=lambda data: data['min_temp']) data = ALL_DATA[0:10] data_max = ALL_DATA[-10:] cities = [] temps = [] cities = list(map(lambda x: x['city'], data)) #print(cities) temps = list(map(lambda x: x['min_temp'], data)) cities_max = list(map(lambda x: x['city'], data_max)) temp_max = list(map(lambda x: x['min_temp'], data_max)) print(cities_max) print(temp_max) #print(temps) # pyecharts库 bar = ( Bar() # chart.add_xaxis("city",) .add_xaxis(cities) .add_yaxis('temperature', temps) # .add_xaxis(cities_max) # .add_yaxis("temperature",temp_max,gap='100%') # 加上了gap就是两个y之间的间距是为多少格 .set_global_opts(title_opts=options.TitleOpts(title="中国天气最低气温排行榜")) ) bar.render('temp.html') # 上面还有一种写法如下: chart=Bar() chart.set_global_opts(title_opts=options.TitleOpts(title="中国天气最低温度排行榜")) chart.add_xaxis(cities_max) chart.add_yaxis('temp',temp_max) chart.render('test.html') abc=( Bar() .add_xaxis(cities_max) .add_yaxis('temp',temp_max) .set_global_opts(title_opts=options.TitleOpts(title="a")) ) abc.render('test2.html') # 还有一种就是通过matplotlib库实现绘图 # from matplotlib import plot as plt # 这个库就是m基于matlab的绘图库,基本上实现差不多 ,但是对于中文字符没法较好显示 # 后面要添加一下数据处理的过程,比如说什么最小二乘法做曲线的线性化 if __name__ == '__main__': main()
最新回复(0)