前言
🚤想获取近15天上海天气数据,并绘制成折线图,用爬虫的xpath
和re
来解决数据获取的需求,pylab
来解决绘制折线图的需求。
⚠️提示:爬虫不可用作违法活动,爬取时要设定休眠时间,不可过度爬取,造成服务器宕机,需付法律责任!!!
一、基本目标
🚣目标是获取上海这个城市15天内的天气高低温数据,并绘制成折线图
二、使用步骤
1.进行分析
⚓️数据采用服务器渲染模式,天气温度数据直接在html页面中包裹,可以利用xpath或者re进行定位获取数据。
但是7天内和8-15天数据两个不同的页面,所以需要爬取两次数据
2.整体代码
import requests
from lxml import etree
from pylab import *
base_url = "http://www.weather.com.cn/weather/101020100.shtml"
resp = requests.get(url=base_url)
html = etree.HTML(resp.text)
lis = html.xpath('//*[@id="7d"]/ul/li')
days = []
lows = []
highs = []
for li in lis:print("正在爬取近7天···")high = li.xpath("./p[2]/span/text()")[0]low = li.xpath("./p[2]/i/text()")[0][0:2]day = li.xpath("./h1/text()")[0][0:2]days.append(day)lows.append((int)(low))highs.append((int)(high))time.sleep(1)
base_url = "http://www.weather.com.cn/weather15d/101020100.shtml"
resp = requests.get(url=base_url)
resp.encoding = 'utf-8'
html = etree.HTML(resp.text)
lis = html.xpath('//*[@id="15d"]/ul/li')
for li in lis:print("正在爬取近8-15天···")high = li.xpath("./span[@class='tem']/em/text()")[0][:2]low = li.xpath("./span[@class='tem']/text()")[0][1:3]day = li.xpath("./span[@class='time']/text()")[0][3:5]days.append(day)lows.append((int)(low))highs.append((int)(high))time.sleep(1)
print("日期列表如下:")
print(days)
print("最低气温列表如下:")
print(lows)
print("最高气温列表如下:")
print(highs)
mpl.rcParams['font.sans-serif'] = ['SimHei']
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)
plt.xlabel(u"日期")
plt.ylabel("温度")
plt.title("近15日气温")
plt.show()
结果
🚔程序运行的输出如下
🚒输出的折线图如下
总结
爬虫的基本步骤:
1.检查有没有反爬,设置常规反反爬,User-Agent
和referer
都是最常见的反爬手段
2.利用xpath
和re
技术进行定位,定位后获取想到的数据即可
3.利用file
文件操作写入到文本中
4.注意设置time
休眠