環境
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']
存在的問題
- 未能實現歷史數據的爬取。
- 請求訪問速度好慢,不知道是什麼原因。
如果有大神知道,求不吝賜教,小菜在此謝過~
推薦資料
我感覺這兩位大神做的挺好的,在此推薦給大家一起學習:
疫情可視化分析系統:http://www.graphvis.cn/graphvis/sari/index.html
爬蟲及可視化:https://blog.csdn.net/xufive/article/details/104093197