更新部落格:
selenium爬取騰訊新聞feiyan頁面實時資料
前言
之前使用騰訊新聞提供的接口爬取資料,詳見之前的博文:
requests+json爬取騰訊新聞feiyan實時資料并實作持續更新
然而騰訊新聞提供的接口太煩人了,老是換,而且從那裡爬下來的資料老是不更新。當時也很疑惑,明明頁面顯示的是實時更新的資料,但接口的
lastUpdate
一直是
False
。
一開始一直在找騰訊新聞實時頁面的接口,但發現用
requests
爬下來的壓根沒有相關的資料。又去看了丁香園的頁面,看起來比騰訊的好爬一些,是以轉戰丁香園(這個感覺是因為當時一直用的
requests
,沒去細看網頁源碼。後來騰訊實時頁面用的
selenium
,再到寫部落格的時候發現丁香園如果
requests
解析的時候不給出頁面内容的話,也可以用
selenium
,這個等寫騰訊頁面的爬取時再說吧)。
當然這也隻是暫時。因為很快我們就發現,丁香園的資料出現一些錯誤(也可能剛好就是那幾天老出錯而已)。于是耐着性子去搗鼓騰訊新聞的實時資料。最後的最後,丁香園跟騰訊的都爬下來啦。
先寫下怎麼爬丁香園實時頁面的資料,後面再寫怎麼爬騰訊新聞實時頁面的資料。這是個比較啰嗦的記錄…
其實就是一邊看爬下來的内容,一邊找要的内容…另外,爬下來的資料處理部分并不是很好,一方面是因為之前那個伺服器不能用
pandas
,不友善用
DataFrame
對象,是以資料處理部分自行改善。
丁香園實時界面
首先,先前往丁香園的網頁。因為主要是想要海外資料,這裡我們選擇闆塊:

點進去會進入以下頁面:
requests探索
我們先使用
requests
解析後看看頁面内容是什麼:
import json
import requests
from bs4 import BeautifulSoup
from datetime import datetime
url = 'https://ncov.dxy.cn/ncovh5/view/pneumonia_top?from=dxy&source=&link=&share='
reponse = requests.get(url)
r = reponse.text
這裡有很多東西,仔細看可以發現有時間戳、需要的資料,還有一些亂碼的部分,這些我們要的内容就放在
<script id="getListByCountryTypeService2true"></script>
裡面。
BeautifulSoup解析
我們用BeautifulSoup來解析内容
soup = BeautifulSoup(reponse.text,'html.parser')
data = soup.find(name = 'script', attrs = {'id': 'getListByCountryTypeService2true'})
data = data.string
這裡再看下
data
,可以發現我們爬下來了整個清單資料,我們所需要的部分放在一個
[]
裡,下面就用正則比對來比對要的部分内容:
# 比對資料
pattern1 = r'\[(.*?)]'
data = re.findall(pattern1, str(data))
data = data[0]
這時候我們要的那部分内容就放到一個字元串變量裡,裡面是很多個
{}
。每個
{}
放着一條資料,我們再用正則比對把這些資料比對出來:
pattern2 = r'({.*?})'
resultDict = re.findall(pattern2, data)
這會爬下來的就是一個清單,每個元素就是一條資料:
我們拿出其中一個元素來進行探索:
temp = resultDict[0]
temp = json.loads(temp + '}')
首先裡面有時間戳(這裡是13位數的),需要轉換為常見的時間格式,還有亂碼的問題。我們提取部分需要(按自己需求提取)的内容進行處理:
temp = resultDict[0]
temp = json.loads(temp + '}')
tempNeed = {}
if len(str(temp['createTime'])) > 10:
tempTime = float(temp['createTime']/1000)
tempTime = datetime.fromtimestamp(int(tempTime))
tempTime = tempTime.strftime("%Y/%m/%d %H:%M:%S")
tempNeed['time'] = tempTime
tempNeed['place'] = temp['provinceName'].encode('iso-8859-1').decode('utf8')
tempNeed['country_en'] = temp['countryFullName']
tempNeed['up_place'] = temp['continents'].encode('iso-8859-1').decode('utf8')
tempNeed['confirmed_num'] = temp['confirmedCount']
tempNeed['die_num'] = temp['deadCount']
tempNeed['cure_num'] = temp['curedCount']
我們看下處理後的樣子:
這裡為什麼要加
}
呢?也是嘗試的時候報 錯 發現的,前面正則比對下來的的玩意裡有一些内部還有
{}
,這裡面放了當日新增資料,但不是所有的元素都有這個(後面讀取的時候會用一個
try
來處理):
提取需要部分
到這裡就差不多了,提取我們要的部分,自行決定要怎麼使用這些内容。
另外注意一點,在處理時發現部分資料是沒有
createTime
或者
modifyTime
的,由于爬取的時間戳基本一緻,我們直接拿第一個時間作為爬取時間就好。
outList = []
for i in range(len(resultDict)):
try:
resultDict[i] = json.loads(resultDict[i] + '}')
except:
resultDict[i] = json.loads(resultDict[i])
place_dict = {}
place_dict['time'] = tempTime
place_dict['place'] = resultDict[i]['provinceName'].encode('iso-8859-1').decode('utf8')
place_dict['country_en'] = resultDict[i]['countryFullName']
place_dict['up_place'] = resultDict[i]['continents'].encode('iso-8859-1').decode('utf8')
place_dict['confirmed_num'] = resultDict[i]['confirmedCount']
place_dict['die_num'] = resultDict[i]['deadCount']
place_dict['cure_num'] = resultDict[i]['curedCount']
outList.append([place_dict['time'], place_dict['place'],
place_dict['country_en'], place_dict['up_place'],
place_dict['confirmed_num'], place_dict['die_num'],
place_dict['cure_num']])
結語
以上就是利用
requests
跟
BeautifulSoup
爬取丁香園頁面的主要内容啦,爬下來之後再自行利用資料進行分析吧!
下一篇再寫使用
selenium
爬取騰訊新聞的實時頁面。