網絡爬蟲:
網絡爬蟲(又稱為網頁蜘蛛,網絡機器人,在FOAF社區中間,更經常的稱為網頁追逐者),是一種按照一定的規則,自動地抓取萬維網信息的程序或者腳本。另外一些不常使用的名字還有螞蟻、自動索引、模擬程序或者蠕蟲。
以上是網絡爬蟲的百度,下面開始介紹使用Python進行網絡爬蟲來獲取數據。
本次內容參考自:
https://www.jianshu.com/p/1e47c3a59646
https://www.bilibili.com/medialist/play/ml317727151
用來獲取新冠肺炎的實時數據。
使用的工具PyCharm
新建Python文件,命名為get_data
使用爬蟲最常用的request模塊
第一部分:
獲取網頁信息:
import requests url = "https://voice.baidu.com/act/newpneumonia/newpneumonia" response = requests.get(url)
第二部分:
可以觀察數據的特點:
數據包含在script標簽里,使用xpath來獲取數據。
導入一個模塊 from lxml import etree
生成一個html對象並且進行解析
可以得到一個類型為list的內容,使用第一項就可以得到全部內容
接下來首先獲取component的內容,這時使用json模塊,將字符串類型轉變為字典(Python的數據結構)
為了獲取國內的數據,需要在component中找到caseList
接下來上代碼:
from lxml import etree import json # 生成HTML對象 html = etree.HTML(response.text) result = html.xpath('//script[@type="application/json"]/text()') result = result[0] # json.load()方法可以將字符串轉化為python數據類型 result = json.loads(result) result_in = result['component'][0]['caseList']
第三部分:
將國內的數據存儲到excel表格中:
使用openyxl模塊,import openpyxl
首先創建一個工作簿,在工作簿下創建一個工作表
接下來給工作表命名和給工作表賦予屬性
代碼如下:
import openpyxl #創建工作簿 wb = openpyxl.Workbook() #創建工作表 ws = wb.active ws.title = "國內疫情" ws.append(['省份', '累計確診', '死亡', '治愈', '現有確診', '累計確診增量', '死亡增量', '治愈增量', '現有確診增量']) ''' area --> 大多為省份 city --> 城市 confirmed --> 累計 crued --> 值域 relativeTime --> confirmedRelative --> 累計的增量 curedRelative --> 值域的增量 curConfirm --> 現有確鎮 curConfirmRelative --> 現有確鎮的增量 ''' for each in result_in: temp_list = [each['area'], each['confirmed'], each['died'], each['crued'], each['curConfirm'], each['confirmedRelative'], each['diedRelative'], each['curedRelative'], each['curConfirmRelative']] for i in range(len(temp_list)): if temp_list[i] == '': temp_list[i] = '0' ws.append(temp_list) wb.save('./data.xlsx')
第四部分:
將國外數據存儲到excel中:
在component的globalList中得到國外的數據
然后創建excel表格中的sheet即可,分別表示不同的大洲
代碼如下:
data_out = result['component'][0]['globalList'] for each in data_out: sheet_title = each['area'] # 創建一個新的工作表 ws_out = wb.create_sheet(sheet_title) ws_out.append(['國家', '累計確診', '死亡', '治愈', '現有確診', '累計確診增量']) for country in each['subList']: list_temp = [country['country'], country['confirmed'], country['died'], country['crued'], country['curConfirm'], country['confirmedRelative']] for i in range(len(list_temp)): if list_temp[i] == '': list_temp[i] = '0' ws_out.append(list_temp) wb.save('./data.xlsx')
整體代碼如下:
import requests from lxml import etree import json import openpyxl url = "https://voice.baidu.com/act/newpneumonia/newpneumonia" response = requests.get(url) #print(response.text) # 生成HTML對象 html = etree.HTML(response.text) result = html.xpath('//script[@type="application/json"]/text()') result = result[0] # json.load()方法可以將字符串轉化為python數據類型 result = json.loads(result) #創建工作簿 wb = openpyxl.Workbook() #創建工作表 ws = wb.active ws.title = "國內疫情" ws.append(['省份', '累計確診', '死亡', '治愈', '現有確診', '累計確診增量', '死亡增量', '治愈增量', '現有確診增量']) result_in = result['component'][0]['caseList'] data_out = result['component'][0]['globalList'] ''' area --> 大多為省份 city --> 城市 confirmed --> 累計 crued --> 值域 relativeTime --> confirmedRelative --> 累計的增量 curedRelative --> 值域的增量 curConfirm --> 現有確鎮 curConfirmRelative --> 現有確鎮的增量 ''' for each in result_in: temp_list = [each['area'], each['confirmed'], each['died'], each['crued'], each['curConfirm'], each['confirmedRelative'], each['diedRelative'], each['curedRelative'], each['curConfirmRelative']] for i in range(len(temp_list)): if temp_list[i] == '': temp_list[i] = '0' ws.append(temp_list) # 獲取國外疫情數據 for each in data_out: sheet_title = each['area'] # 創建一個新的工作表 ws_out = wb.create_sheet(sheet_title) ws_out.append(['國家', '累計確診', '死亡', '治愈', '現有確診', '累計確診增量']) for country in each['subList']: list_temp = [country['country'], country['confirmed'], country['died'], country['crued'], country['curConfirm'], country['confirmedRelative']] for i in range(len(list_temp)): if list_temp[i] == '': list_temp[i] = '0' ws_out.append(list_temp) wb.save('./data.xlsx')
結果如下:
國內:
國外: