1. 程式人生 > >Scrapy實踐----獲取天氣信息

Scrapy實踐----獲取天氣信息

其余 turn format log mat for hid file 當前

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實踐----獲取天氣信息