Scrapy實踐----獲取天氣信息
scrapy是一個非常好用的爬蟲框架,它是基於Twisted開發的,Twisted又是一個異步網絡框架,既然它是異步的,那麽執行起來肯定會很快,所以scrapy的執行速度也不會慢的!
如果你還沒沒有學過scrapy的話,那麽我建議你先去學習一下,再來看這個小案例,畢竟這是基於scrapy來實現的!網上有很多有關scrapy的學習資料,你可以自行百度來學習!
接下來進入我們的正題:
如何利用scrapy來獲取某個城市的天氣信息呢?
我們爬取的網站是:天氣網
城市我們可以自定義
1.創建項目名稱
scrapy startproject weatherSpider
2.編寫items.py文件
在這個文件中我們主要定義我們想要抓取的數據:
a.城市名(city)
b.日期(date)
c.天氣狀況(weather)
d.濕度(humidity)
e.空氣質量(air_quality)
1 import scrapy
2
3
4 class WeatherspiderItem(scrapy.Item):
5 """
6 設置要爬取的信息
7 """
8 city = scrapy.Field()
9 date = scrapy.Field()
10 weather = scrapy.Field()
11 humidity = scrapy.Field()
12 air_quality = scrapy.Field()
3.打開網頁
利用Chrome瀏覽器來提取上面5個信息
利用同樣的方式我們可以找到其余4個信息個XPath表達式
4.編寫爬蟲文件
在第3步中我們已經找到我們想要的信息的XPath表達式了,我們就可以開始寫代碼了
1 import scrapy
2 from scrapy import loader
3
4 from ..items import WeatherspiderItem
5
6
7 class WeatherSpider(scrapy.Spider):
8 name = ‘weather‘
9 allowed_domains = [‘tianqi.com‘]
10 # 這是事先定義好的城市,我們還可以在裏面添加其他城市名稱
11 cities = [‘shanghai‘, ‘hangzhou‘, ‘beijing‘]
12 base_url = ‘https://www.tianqi.com/‘
13 start_urls = []
14 for city in cities:
15 start_urls.append(base_url + ‘{}‘.format(city))
16
17
18
19
20 def parse(self, response):
21 """
22 提取上海今天的天氣信息
23 :param response:
24 :return:
25 """
26 # 創建一個ItemLoader,方便處理數據
27 iloader = loader.ItemLoader(WeatherspiderItem(),response=response)
28 iloader.add_xpath("city", ‘//dl[@class="weather_info"]//h2/text()‘)
29 iloader.add_xpath(‘date‘, ‘//dl[@class="weather_info"]/dd[@class="week"]/text()‘)
30 iloader.add_xpath(‘weather‘, ‘//dl[@class="weather_info"]/dd[@class="weather"]‘
31 ‘/p[@class="now"]/b/text()‘)
32 iloader.add_xpath(‘weather‘, ‘//dl[@class="weather_info"]/dd[@class="weather"]‘
33 ‘/span/b/text()‘)
34 iloader.add_xpath(‘weather‘, ‘//dl[@class="weather_info"]/dd[@class="weather"]‘
35 ‘/span/text()‘)
36 iloader.add_xpath(‘humidity‘, ‘//dl[@class="weather_info"]/dd[@class="shidu"]‘
37 ‘/b/text()‘)
38 iloader.add_xpath(‘air_quality‘, ‘//dl[@class="weather_info"]/dd[@class="kongqi"]‘
39 ‘/h5/text()‘)
40 iloader.add_xpath(‘air_quality‘, ‘//dl[@class="weather_info"]/dd[@class="kongqi"]‘
41 ‘/h6/text()‘)
42 return iloader.load_item()
如果覺得困惑為何要使用ItemLoader的話,建議去讀一下關於ItemLoader的官方文檔:傳送門
5.結果保存為JSON格式
要想把我們提取的結果保存到某種文件中,我們需要編寫pipelines
1 import os
2 import json
3
4
5 class StoreAsJson(object):
6 def process_item(self, item, spider):
7 # 獲取工作目錄
8 pwd = os.getcwd()
9 # 在當前目錄下創建文件
10 filename = pwd + ‘/data/weather.json‘
11
12 with open(filename, ‘a‘) as fp:
13 line = json.dumps(dict(item), ensure_ascii=False) + ‘\n‘
14 fp.write(line)
6.添加設置信息
我們寫的pipelines文件要起作用,需要在settings.py中設置
1 ITEM_PIPELINES = {
2 ‘WeatherSpider.pipelines.StoreAsJson‘: 300,
3 }
7.啟動爬蟲
scrapy crawl wether
8.參考資料
從零開始寫Python爬蟲 --- 2.3 爬蟲實踐:天氣預報&數據存儲
如果大家喜歡的話,請點個贊!!O(∩_∩)O
Scrapy實踐----獲取天氣信息