想獲取近15天上海天氣數據,並繪制成折線圖,用爬蟲的xpath
和re
來解決數據獲取的需求,pylab
來解決繪制折線圖的需求。
️提示:爬蟲不可用作違法活動,爬取時要設定休眠時間,不可過度爬取,造成服務器宕機,需付法律責任!!!
目標是獲取上海這個城市15天內的天氣高低溫數據,並繪制成折線圖
️數據采用服務器渲染模式,天氣溫度數據直接在html頁面中包裹,可以利用xpath或者re進行定位獲取數據。
但是7天內和8-15天數據兩個不同的頁面,所以需要爬取兩次數據
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
休眠