日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

爬取全国空气质量数据

發布時間:2024/3/26 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 爬取全国空气质量数据 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

思路:
1、空氣質量在線監測平臺 https://www.aqistudy.cn/;
2、分析網站,找到歷史數據查詢入口:https://www.aqistudy.cn/historydata/,首頁為各城市入口,二層統計各月份數據,三層為每日數據;
3、使用crawspider獲取每月url;
4、xpath解析數據,保存至csv和redis數據庫中。

出現的問題:
除首頁外,網頁使用了動態JS,無法直接解析獲取需要的數據。

解決:
改寫下載中間件,使用webdrive發送get請求,獲取數據。

一、準備工作

創建一個scrapy project:

scrapy startproject AQI

創建spider file

scrapy genspider -t crawl aqi aqistudy.cn

二、構建框架
(1)items.py / 定義item

import scrapy #獲取城市名稱、日期、AQI等數據 class AirItem(scrapy.Item):Title = scrapy.Field()Day = scrapy.Field()AQI = scrapy.Field()Quality_level = scrapy.Field()PM_2_5 = scrapy.Field()PM_10 = scrapy.Field()SO2 = scrapy.Field()CO = scrapy.Field()NO2 = scrapy.Field()O3_8H = scrapy.Field()

(2) spider.py

from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from AIR.items import AirItemclass AirSpider(CrawlSpider):name = 'aqi'allowed_domains = ['aqistudy.cn']start_urls = ['https://www.aqistudy.cn/historydata/']#以獲取武漢2019年數據舉例,rule-1獲取武漢url,rule-2獲取2019年urlrules = (Rule(LinkExtractor(allow=r'city=武漢$')),#無callback默認follow為TrueRule(LinkExtractor(allow=r'month=2019'), callback='parse_item', follow=False),)def parse_item(self, response):item = AirItem()item['Title'] = response.xpath('//*[@id="title"]/text()').extract_first()[8:-11]air_list = response.xpath('//tbody/tr')for air in air_list[1:]:item['Day'] = air.xpath('./td[1]/text()').extract_first()item['AQI'] = air.xpath('./td[2]/text()').extract_first()item['Quality_level'] = air.xpath('./td[3]/span/text()').extract_first()item['PM_2_5'] = air.xpath('./td[4]/text()').extract_first()item['PM_10'] = air.xpath('./td[5]/text()').extract_first()item['SO2'] = air.xpath('./td[6]/text()').extract_first()item['CO'] = air.xpath('./td[7]/text()').extract_first()item['NO2'] = air.xpath('./td[8]/text()').extract_first()item['O3_8H'] = air.xpath('./td[9]/text()').extract_first()print(item['Day'])yield item

(3) middlewares.py
改寫下載中間件,使用webdriver發送請求

import scrapy from selenium import webdriver import timeclass ChromeMiddleware(object): #先思考一下發送request請求需要的幾步:url,driver、獲取數據、返回需要的響應對象def process_request(self, request, spider):#1、urlurl = request.urlif url != 'https://www.aqistudy.cn/historydata/':#webdriver獲取數據速度較慢,不需要使用的頁面,使用if判斷語句跳過#2、設置driver對象driver = webdriver.Chrome()#3、使用driver發生get請求driver.get(url)#考慮網速,手動延遲3秒time.sleep(3)#4、獲取數據data = driver.page_source#5、關閉瀏覽器driver.quit()#6、返回scrapy框架需要的響應對象#這里查看源碼,http下的response,HtmlResponse繼承父類TextResponse,默認編碼ASCII需要改為“utf-8”#查看父類response,需要的參數有:(url, status=200, headers=None, body=b'', flags=None, request=None)#獲取的數據為字符串格式,需要編碼為二進制格式return scrapy.http.HtmlResponse(url=url,status=200,body=data.encode('utf-8'),encoding = 'utf-8')

(4)pipelines.py

from scrapy.exporters import CsvItemExporter import redis import json #管道一:存儲到CSV格式 class AirPipeline(object):def open_spider(self,spider):self.file = open('airdata.csv','wb')self.exporter = CsvItemExporter(self.file)self.exporter.start_exporting()def process_item(self, item, spider):self.exporter.export_item(item)return itemdef close_spider(self,spider):self.exporter.finish_exporting()self.file.close()#管道二:存儲redis數據庫 class RedisPipeline(object):def open_spider(self,spider):self.redis = redis.StrictRedis(host='127.0.0.1',port=6379)self.redis_key = 'spider_air'def process_item(self,item,spider):#將獲取到的數據轉為json字符串格式self.redis.lpush(self.redis_key,json.dumps.(dict(item)))return item

5)設置setting
一般寫好一部分代碼就開啟相應的設置,以防忘記

BOT_NAME = 'AQI' SPIDER_MODULES = ['AQI.spiders'] NEWSPIDER_MODULE = 'AQI.spiders' LOG_FILE = 'AQI.log' LOG_LEVEL = 'WARNING' ROBOTSTXT_OBEY = False DOWNLOAD_DELAY = 3 DOWNLOADER_MIDDLEWARES = {'AIR.middlewares.ChromeMiddleware': 543, } ITEM_PIPELINES = {'AIR.pipelines.AirPipeline': 300,'AIR.pipelines.RedisPipeline': 400, }

三、運行spider
(1)打開Redis服務器,啟動客戶端

redis-server redis-cli

(2)運行spider

scrapy crawl aqi

四、完成以上幾步即可等待查看數據啦

總結

以上是生活随笔為你收集整理的爬取全国空气质量数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。