在咱們平常的數據採集中,時間time的重要性毋庸置疑的,由於它是衡量採集到的信息是否具備正確時效性的惟一因素。若是咱們採集到的信息對於客戶來講已是過時的信息,這對於客戶沒有使用的價值,影響客戶使用。html
因此咱們今天就來講說在平常採集中遇到的時間如何正確採集,保證信息的時效性。python
1>.首先咱們要獲取當前的時間,纔能有效的判斷信息的時效性。post
import datetime #獲取當前時間 gtime = datetime.datetime.now() # #獲取當前時間的年 月 日.day year = datetime.datetime.now().year month = datetime.datetime.now().month day = datetime.datetime.now().day
2>.時間的格式化。在採集外文網站中常會遇到(Mar 09,2018\ Thu Jun 22 00:00:00 CST 2017),對照着進行匹配測試
%a星期的簡寫。如 星期三爲Web %A星期的全寫。如 星期三爲Wednesday %b月份的簡寫。如4月份爲Apr %B月份的全寫。如4月份爲April %c: 日期時間的字符串表示。(如: 04/07/10 10:43:39) %d: 日在這個月中的天數(是這個月的第幾天) %f: 微秒(範圍[0,999999]) %H: 小時(24小時制,[0, 23]) %I: 小時(12小時制,[0, 11]) %j: 日在年中的天數 [001,366](是當年的第幾天) %m: 月份([01,12]) %M: 分鐘([00,59]) %p: AM或者PM %S: 秒(範圍爲[00,61],爲何不是[00, 59],參考python手冊~_~) %U: 周在當年的週數當年的第幾周),星期天做爲周的第一天 %w: 今天在這周的天數,範圍爲[0, 6],6表示星期天 %W: 周在當年的週數(是當年的第幾周),星期一做爲周的第一天 %x: 日期字符串(如:04/07/10) %X: 時間字符串(如:10:43:39) %y: 2個數字表示的年份 %Y: 4個數字表示的年份 %z: 與utc時間的間隔 (若是是本地時間,返回空字符串) %Z: 時區名稱(若是是本地時間,返回空字符串) %%: %% => %
#Mar 09,2018\ Thu Jun 22 00:00:00 CST 2017 c_time = 'Mar 09,2018' print(type(c_time)) #查看類型是--<str> ctime = datetime.datetime.strptime(c_time,"%b %d,%Y") print(ctime) print(type(ctime)) #查看類型是--<class 'datetime.datetime'>
3>.藉助正則來提高匹配率網站
ctime = data.xpath('''//span[@class="time"]''').regex('(\d+-\d+-\d+ \d+:\d+:\d+|\d+-\d+-\d+ \d+:\d+|\d+-\d+-\d+|\d+-\d+ \d+:\d+)').datetime()
4>.對於時間裏麪包含漢字(年、月、日)(剛剛、分鐘前、小時前、天前)url
4.1.時間裏麪包含年、月、日---2018年3月15日 12:25spa
import htmlparser #導包 ctime = htmlparser.Parser(data.xpath('''//span[@class="time"]''').text().replace('年', '-').replace('月', '-').replace('日', '')).datetime()
4.2.時間裏麪包含剛剛、分鐘前、小時前、天前unix
ctime = data.xpath('''//span[@class="topic_time"]/text()''').text().strip() if "剛剛" in ctime: ctime = gtime - datetime.timedelta(minutes=1) elif "分鐘前" in ctime: ctime = re.search(r'\d+', ctime).group() ctime = gtime - datetime.timedelta(minutes=int(ctime)) elif "小時前" in ctime: ctime = re.search(r'\d+', ctime).group() ctime = gtime - datetime.timedelta(hours=int(ctime)) elif "天前" in ctime: ctime = re.search(r'\d+', ctime).group() ctime = gtime - datetime.timedelta(days=int(ctime)) else: # return None ctime = htmlparser.Parser(ctime).datetime()
5>.對於正文裏面沒有時間的,查看是否url裏面含有時間的信息 http://www.shanxi.gov.cn/sq/dwjl/gjjmlw/201802/t20180208_396922.shtmlcode
import re post_url = 'http://www.shanxi.gov.cn/sq/dwjl/gjjmlw/201802/t20180208_396922.shtml' c_time = re.search('''t(\d{8})_''', post_url).group(1) ctime = datetime.datetime.strptime(c_time, "%Y%m%d") - datetime.timedelta(0, 3600 * 8)
6>.時間戳的轉化(若是採集的內容裏面沒有時間,能夠查找相似1548906627這樣的一串數,打開http://tool.chinaz.com/Tools/unixtime.aspx,測試一下是不是時間戳格式的)
若是肯定是時間戳格式的htm
===============時間戳格式轉換============== c_time1 = '獲取到的時間戳' ctime = datetime.datetime.utcfromtimestamp(int(c_time1))
最後,此內容爲本身整理所得,若有不適合你的狀況,請另行其它方法解決。