前言
🚤想获取近15天上海天气数据,并绘制成折线图,用爬虫的xpath
和re
来解决数据获取的需求,pylab
来解决绘制折线图的需求。
⚠️提示:爬虫不可用作违法活动,爬取时要设定休眠时间,不可过度爬取,造成服务器宕机,需付法律责任!!!
一、基本目标
🚣目标是获取上海这个城市15天内的天气高低温数据,并绘制成折线图
二、使用步骤
1.进行分析
⚓️数据采用服务器渲染模式,天气温度数据直接在html页面中包裹,可以利用xpath或者re进行定位获取数据。
但是7天内和8-15天数据两个不同的页面,所以需要爬取两次数据
2.整体代码
import requests
from lxml import etree
from pylab import * # 支持中文
# 设置爬取网站url
base_url = "http://www.weather.com.cn/weather/101020100.shtml"
# requests进行爬取代码
resp = requests.get(url=base_url)
# XPATH解析
html = etree.HTML(resp.text)
# 拿到天气的li,在li里包含每天天气的全部数据,包括日期/天气/气温/城市等等
lis = html.xpath('//*[@id="7d"]/ul/li')
# 创建日期、最高气温、最低气温的数组,为了后续把爬取的数据添加到数组中,进而进一步把数组用plot进行绘制折线图
days = []
lows = []
highs = []
# 对7天天气的li进行遍历,为了获取高低温度和日期
for li in lis:
print("正在爬取近7天···")
# 获取7天高温
high = li.xpath("./p[2]/span/text()")[0]
# 获取7天低温
low = li.xpath("./p[2]/i/text()")[0][0:2]
# 获取7天日期
day = li.xpath("./h1/text()")[0][0:2]
# 把7天日期、高温、低温添加到数组中
days.append(day)
lows.append((int)(low))
highs.append((int)(high))
# 设置休眠1秒
time.sleep(1)
# 设置8-15天的url
base_url = "http://www.weather.com.cn/weather15d/101020100.shtml"
# requests进行爬取8-15天页面代码
resp = requests.get(url=base_url)
# 设置编码
resp.encoding = 'utf-8'
# XPATH解析
html = etree.HTML(resp.text)
# 拿到8-15天源码里每天的天气的li
lis = html.xpath('//*[@id="15d"]/ul/li')
# 对8-15天的天气li进行遍历,为了获取高低温度和日期
for li in lis:
print("正在爬取近8-15天···")
# 获取8-15天高温
high = li.xpath("./span[@class='tem']/em/text()")[0][:2]
# 获取8-15天低温
low = li.xpath("./span[@class='tem']/text()")[0][1:3]
# 获取8-15天日期
day = li.xpath("./span[@class='time']/text()")[0][3:5]
# 把8-15天日期、高温、低温添加到数组中
days.append(day)
lows.append((int)(low))
highs.append((int)(high))
# 设置休眠1秒
time.sleep(1)
# 爬取15日的日期、高低气温结束
# 打印15日各项信息
print("日期列表如下:")
print(days)
print("最低气温列表如下:")
print(lows)
print("最高气温列表如下:")
print(highs)
# 下方代码绘制高低气温折线图图表
# 设置字体
mpl.rcParams['font.sans-serif'] = ['SimHei']
# 设置x轴长度
x = range(len(days))
# 限定纵轴的范围
plt.ylim(0, 40)
# 低温、高温数据加载,设置图形表示,设置解释
plt.plot(x, lows, marker='o', mec='r', mfc='w', label=u'最低气温')
plt.plot(x, highs, marker='*', ms=10, label=u'最高气温')
# 让图例生效
plt.legend()
plt.xticks(x, days, rotation=45)
plt.margins(0)
plt.subplots_adjust(bottom=0.15)
# X轴标签
plt.xlabel(u"日期")
# Y轴标签
plt.ylabel("温度")
# 标题
plt.title("近15日气温")
# 图例显示
plt.show()
结果
🚔程序运行的输出如下
🚒输出的折线图如下
总结
爬虫的基本步骤:
1.检查有没有反爬,设置常规反反爬,User-Agent
和referer
都是最常见的反爬手段
2.利用xpath
和re
技术进行定位,定位后获取想到的数据即可
3.利用file
文件操作写入到文本中
4.注意设置time
休眠