scrapy框架實現2019-nCoV省級疫情每日數據爬取

環境

win 10 + python 3.6 + pycharm + scrapy 3.2.3

獲取URL

騰訊新聞肺炎疫情進入:https://news.qq.com/zt2020/page/feiyan.htm#/

F12打開開發者工具,切換到Network,F5刷新頁面,關注新出現的內容,找到我們所需要的url (https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&callback=jQuery341007164458125928896_1583443338409&_=1583443338410)。

並且可以知道,這是一個json格式的請求。

對url地址、請求方法、參數、應答格式等信息進行深入分析:

callback是回調函數,嘗試清空;

=1583443338410”中的數字爲時間戳,驗證方法:

import time

print(time.time())

由此,可以構造符合我們需求的url,並進行抓取:

# -*- coding: utf-8 -*-
import scrapy
from yiqing.items import YiqingItem
import time
import json, requests

class YiqingSpiderSpider(scrapy.Spider):
    name = 'yiqing_spider'
    allowed_domains = ['view.inews.qq.com']
    start_urls = ['https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&callback=&_=%d'%int(time.time()*1000)]

    def parse(self, response):
        #查看是否請求回數據
        print(response.text)
        print(type(response.text))

分析抓取的內容

藉助在線json校驗格式化工具解析抓取到的內容,以json.load()和json.loads()方法對內容節點進行分析,最終得到我們所需數據的節點。

實現數據結構(items.py)

在此基礎上,可以增加更多的變量,如市級、其他國家等內容。

import scrapy

class YiqingItem(scrapy.Item):
    # 日期
    crawl_date = scrapy.Field()
    # 省名
    province_name = scrapy.Field()
    # 今日確診
    province_confirm = scrapy.Field()
    # 今日疑似
    province_suspect = scrapy.Field()
    # 死亡
    province_dead = scrapy.Field()
    # 治癒
    province_heal = scrapy.Field()

 數據處理並保存(yiqing_spyder.py)

記得yield進行保存,老忘記~

    def parse(self, response):
        # 查看是否請求回數據
        # # print(response.text)
        text = response.text
        print(type(text))
        data1 = json.loads(text)
        print(type(data1))
        data = json.loads(data1['data'])['areaTree'][0]['children']
        print(type(data))
        data_date = json.loads(data1['data'])['lastUpdateTime']
        yiqing_item = YiqingItem()
        yiqing_item['crawl_date'] = data_date
        yield yiqing_item
        for item in range(0,len(data)):
            yiqing_item = YiqingItem()
            # 省名
            yiqing_item['province_name'] = data[item]['name']
            # 今日確診
            yiqing_item['province_confirm'] = data[item]['today']['confirm']
            # 今日疑似
            yiqing_item['province_suspect'] = data[item]['today']['confirmCuts']
            # 死亡
            yiqing_item['province_dead'] = data[item]['total']['dead']
            # 治癒
            yiqing_item['province_heal'] = data[item]['total']['heal']

            yield yiqing_item

運行並導出爲csv文件

中文出現亂碼,記得用notepad++轉爲utf-8 Bom保存後,再用excel打開查看。

from scrapy import cmdline

# 運行
# cmdline.execute('scrapy crawl yiqing_spider'.split())

# 導出
cmdline.execute('scrapy crawl yiqing_spider -o test.csv'.split())

結果展示

注意事項

json.load()與json.loads()的區別:

簡單地說,load()是json轉爲dict;而loads()是str轉爲dict。

‘data’節點讀取完後,需要將str轉爲dict再進行後續操作,否則會報錯。

data = json.loads(data1['data'])['areaTree'][0]['children']

存在的問題

  1. 未能實現歷史數據的爬取。
  2. 請求訪問速度好慢,不知道是什麼原因。

如果有大神知道,求不吝賜教,小菜在此謝過~

推薦資料

我感覺這兩位大神做的挺好的,在此推薦給大家一起學習:

疫情可視化分析系統:http://www.graphvis.cn/graphvis/sari/index.html

爬蟲及可視化:https://blog.csdn.net/xufive/article/details/104093197

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章