Python分布式通用爬虫(4):处理并统一时间格式
如有不同意见或者其他建议,欢迎前来讨论。
划分.py文件部分
该分布式爬虫主要分为五个部分:(1)执行文件(程序的开端)、(2)获取xpath信息、(3)获取所需内容、(4)时间处理、(5)数据入库
我们想要获取某些网站的信息可以通过下载网站内容、复制文字、利用程序获取内容等等方法。现在,我们如果只想要一部分内容,而不是所有的信息,就可以通过程序去获取相应的部分。这个时候我们可以使用的编程语言就有C、C++、JAVA、Python等等。由于Python使用起来比较便捷,我们本次使用的编程语言为Python。我们使用的工具有PyCharm、Oracle11G等等。
处理并统一时间格式
由于不同国家表示的时间都是不一样的,所以我们需要统一一下格式,方便我们对数据进行增删改查。
普通时间转换
在大多数情况下,我们可以直接使用python自带的函数去转换时间格式,将时间转换成datetime格式。
代码展示
下面展示一些 普通时间转换代码片
。
其中第一个是国际通用时间例:①2021/10/9 ②July 9 2021 ③9 July 2021等等
转换,第二个是日期写最前边的时间例:①9/10/2021 ②9-10-2021 ③9.10.2021等等
转换。
parse('2021/10/9', fuzzy=True).replace(tzinfo=None)
parse('9/10/2021', fuzzy=True, dayfirst=True).replace(tzinfo=None)
佛历时间转换
在这种情况下,我们不能直接使用python自带的函数去转换时间格式,这个时候就需要对时间进行特殊处理。
代码展示
下面展示一些 佛历时间转换代码片
。
这里的月份替换在另一个函数里,会在最后展示出来。
由于涉及到很多种不同的写法,所以就分了很多种情况,这样写基本涵盖了所有的佛历书写情况。
def foli_time()
each_found = re.findall(r'\d+', str(original_time))
year_time = ''
if month_time == '':
if len(each_found[2]) == 4:
year_time = str(int(each_found[2]) - 543)
elif len(each_found[2]) == 2:
year_time = '20' + str(int(each_found[2]) - 43)
month_time = str(each_found[1])
each_found[2] = each_found[3]
each_found[3] = each_found[4]
else:
if len(each_found[1]) == 4:
year_time = str(int(each_found[2]) - 543)
elif len(each_found[1]) == 2:
year_time = '20' + str(int(each_found[1]) - 43)
if len(each_found) >= 4:
com_time = year_time + '-' + month_time + '-' + each_found[0] + ' ' + each_found[2] + ':' +\
each_found[3]
return_time = datetime.strptime(com_time, "%Y-%m-%d %H:%M")
else:
com_time = year_time + '-' + month_time + '-' + each_found[0]
return_time = datetime.strptime(com_time, "%Y-%m-%d")
return return_time
缅甸语时间转换
缅甸语的时间可能连数字都会替换掉,所以我们把缅甸语时间转换也单列出来,将其中的数字替换掉在进行处理。
代码展示
下面展示一些 缅甸语时间转换代码片
。
这里的月份替换在另一个函数里,会在最后展示出来。
def miandian_time()
original_time= str(original_time).replace('၁', '1').replace('၂', '2').replace('၃', '3').replace('၄', '4').replace('၅', '5').replace('၆', '6').replace('၇', '7').replace('၈', '8').replace('၉', '9').replace('၀', '0')
each_found = re.findall(r'\d+', original_time)
if len(each_found) >= 4:
com_time = each_found[1] + '-' + month_time + '-' + each_found[0] + ' ' + each_found[2] + ':' + each_found[3]
return_time = datetime.strptime(com_time, "%Y-%m-%d %H:%M")
else:
com_time = each_found[1] + '-' + month_time + '-' + each_found[0]
return_time = datetime.strptime(com_time, "%Y-%m-%d")
return return_time
其他需要替换月份的时间转换
有一些其他国家的时间表示可能会将月份换为自己的语言,比如德语、意大利语、高棉语、老挝语等等。
代码展示
下面展示一些 其他需要替换月份的时间转换代码片
。
这里的月份替换在另一个函数里,会在最后展示出来。
def other_time()
each_found = re.findall(r'\d+', original_time)
if len(each_found) >= 4:
com_time = each_found[1] + '-' + month_time + '-' + each_found[0] + ' ' + each_found[2] + ':' + each_found[3]
return_time = datetime.strptime(com_time, "%Y-%m-%d %H:%M")
else:
com_time = each_found[1] + '-' + month_time + '-' + each_found[0]
return_time = datetime.strptime(com_time, "%Y-%m-%d")
return return_time
间隔时间转换
除了上述的一些情况外,我们可能会遇到几小时之前、几天之前、昨天、今天等等表示的时间,这样我们就需要另外的一些处理办法。
代码展示
下面展示一些 间隔时间转换代码片
。
def ago_time(at):
if '分钟前' in at:
minutes = at[:at.find('分钟前')]
return datetime.combine(datetime.now() - timedelta(minutes=int(minutes)), datetime.min.time())
elif '分鐘前' in at:
minutes = at[:at.find('分鐘前')]
return datetime.combine(datetime.now() - timedelta(minutes=int(minutes)), datetime.min.time())
elif 'min' in at:
minutes = at[:at.find('min')]
return datetime.combine(datetime.now() - timedelta(minutes=int(minutes)), datetime.min.time())
elif '小时前' in at:
hour = at[:at.find('小时前')]
return datetime.combine(datetime.now() - timedelta(hours=int(hour)), datetime.min.time())
elif '小時前' in at:
hour = at[:at.find('小時前')]
return datetime.combine(datetime.now() - timedelta(hours=int(hour)), datetime.min.time())
elif 'hour' in at:
hour = at[:at.find('hour')]
return datetime.combine(datetime.now() - timedelta(hours=int(hour)), datetime.min.time())
elif 'hr' in at:
hour = at[:at.find('hr')]
return datetime.combine(datetime.now() - timedelta(hours=int(hour)), datetime.min.time())
elif 'today' in at or 'Today' in at or 'TODAY' in at or '今天' in at:
return datetime.combine(datetime.now().date(), datetime.min.time())
elif 'yesterday' in at or 'Yesterday' in at or 'YESTERDAY' in at or '昨天' in at:
return datetime.combine(datetime.now().date() - timedelta(days=1), datetime.min.time())
elif '天前' in at:
day = at[:at.find('天前')]
return datetime.combine(datetime.now() - timedelta(days=int(day)), datetime.min.time())
elif 'day' in at:
day = at[:at.find('day')]
return datetime.combine(datetime.now() - timedelta(days=int(day)), datetime.min.time())
elif '周前' in at:
week = at[:at.find('周前')]
return datetime.combine(datetime.now() - timedelta(weeks=int(week)), datetime.min.time())
elif '週前' in at:
week = at[:at.find('週前')]
return datetime.combine(datetime.now() - timedelta(weeks=int(week)), datetime.min.time())
elif 'week' in at:
week = at[:at.find('week')]
return datetime.combine(datetime.now() - timedelta(weeks=int(week)), datetime.min.time())
elif '个月前' in at:
month = at[:at.find('个月前')]
return datetime.combine(datetime.now() - timedelta(days=int(month) * 30), datetime.min.time())
elif '個月前' in at:
month = at[:at.find('個月前')]
return datetime.combine(datetime.now() - timedelta(days=int(month) * 30), datetime.min.time())
elif 'month' in at:
month = at[:at.find('month')]
return datetime.combine(datetime.now() - timedelta(days=int(month) * 30), datetime.min.time())
else:
try:
return parse(at, fuzzy=True).replace(tzinfo=None)
except Exception as e_time:
print(e_time)
return datetime.combine(datetime.now().date(), datetime.min.time())
汉语藏语时间转换
汉语时间可以直接进行处理,藏语的需要先换一些东西。
代码展示
下面展示一些 汉语藏语时间转换代码片
。
其中藏语的可能我遇到的太少了,有一定可能性会碰到处理不了的藏语时间。
if re.findall(r'སྤྱི་ཟླ་*. པའི་ཚེས་*.', str(original_time)):
original_time = str(original_time).replace('༡', '1').replace('༢', '2').replace('༣', '3').replace('༤', '4').replace('༥', '5').replace('༦', '6').replace('༧', '7').replace('༨', '8').replace('༩', '9').replace('༠', '0')
original_time = original_time.replace(r'སྤྱི་ཟླ་', '').replace(r' པའི་ཚེས་', '-').replace(r' ', ' ').replace(r' ', '-')
if re.findall(r'\d{1,4}-\d{1,2}-\d{1,2} ཁུངས།', str(original_time)):
original_time = ''.join(re.findall(r'\d{1,4}-\d{1,2}-\d{1,2} ཁུངས།', str(original_time)))
if re.findall(r'སྤེལ་དུས།:\d{1,4}-\d{1,2}-\d{1,2} རྩོམ་པ་པོ།', str(original_time)):
original_time = ''.join(re.findall(r'སྤེལ་དུས།:\d{1,4}-\d{1,2}-\d{1,2} རྩོམ་པ་པོ།', str(original_time)))
if re.findall(r'\d{1,4}年\d{1,2}月\d{1,2}日\s\d{1,2}:\d{1,2}', str(original_time)):
com_time = ''.join(re.findall(r'\d{1,4}年\d{1,2}月\d{1,2}日\s\d{1,2}:\d{1,2}', str(original_time))).replace('年', '-').replace('月', '-').replace('日', '')
return_time = datetime.strptime(com_time, "%Y-%m-%d %H:%M")
return return_time
elif re.findall(r'\d{1,4}年\d{1,2}月\d{1,2}日\d{1,2}:\d{1,2}', str(original_time)):
com_time = ''.join(re.findall(r'\d{1,4}年\d{1,2}月\d{1,2}日\d{1,2}:\d{1,2}', str(original_time))).replace('年', '-').replace('月', '-').replace('日', ' ')
return_time = datetime.strptime(com_time, "%Y-%m-%d %H:%M")
return return_time
elif re.findall(r'\d{1,4}年\d{1,2}月\d{1,2}日', str(original_time)):
com_time = ''.join(re.findall(r'\d{1,4}年\d{1,2}月\d{1,2}日', str(original_time))).replace('年', '-').replace('月', '-').replace('日', '')
return_time = datetime.strptime(com_time, "%Y-%m-%d")
return return_time
elif re.findall(r'\d{1,4} ཟླ་བ་ \d{1,2} ཚེས \d{1,2}', str(original_time)):
com_time = ''.join(re.findall(r'\d{1,4} ཟླ་བ་ \d{1,2} ཚེས \d{1,2}', str(original_time))).replace(' ཟླ་བ་ ', '-').replace(' ཚེས ', '-')
return_time = datetime.strptime(com_time, "%Y-%m-%d")
return return_time
月份替换函数
有一些其他国家的时间表示可能会将月份换为自己的语言,比如德语、意大利语、高棉语、老挝语等等。这个函数的主要目的就是将这些不同语言的月份转换成可识别的字符串数字。
代码展示
下面展示一些 月份替换函数代码片
。
def month_time_set(ot):
month_time = ''
if ("JAN" in ot) or ("Jan" in ot) or ("ม.ค." in ot) or ("มกราคม" in ot) or ("មករា" in ot) or ("ဇန္နဝါရီ၊" in ot) or ("ဇန်နဝါရီ" in ot) or ("ມັງກອນ" in ot) or ("Gennaio" in ot):
month_time = '01'
elif ("FEB" in ot) or ("Feb" in ot) or ("ก.พ." in ot) or ("กุมภาพันธ์" in ot) or ("កុម្ភៈ" in ot) or ("ေဖေဖာ္၀ါရီ၊" in ot) or ("ဖေဖော်ဝါရီ" in ot) or ("ກຸມພາ" in ot):
month_time = '02'
elif ("MAR" in ot) or ("Mar" in ot) or ("มี.ค." in ot) or ("มีนาคม" in ot) or ("មីនា" in ot) or ("Mär" in ot) or ("Maerz" in ot) or ("မတ္၊" in ot) or ("မတ်" in ot) or ("ມີນາ" in ot):
month_time = '03'
elif ("APR" in ot) or ("Apr" in ot) or ("เม.ย." in ot) or ("เมษายน" in ot) or ("មេសា" in ot) or ("ဧၿပီ၊" in ot) or ("ဧပြီ" in ot) or ("ເມສາ" in ot):
month_time = '04'
elif ("MAY" in ot) or ("May" in ot) or ("พ.ค." in ot) or ("พฤษภาคม" in ot) or ("ឧសភា" in ot) or ("Mai" in ot) or ("ေမ၊" in ot) or ("မေ" in ot) or ("ພຶດສະພາ" in ot) or ("Maggio" in ot):
month_time = '05'
elif ("JUN" in ot) or ("Jun" in ot) or ("มิ.ย." in ot) or ("มิถุนายน" in ot) or ("មិថុនា" in ot) or ("ဇြန္၊" in ot) or ("ဇွန်" in ot) or ("ມິຖຸນາ" in ot) or ("Giugno" in ot):
month_time = '06'
elif ("JUL" in ot) or ("Jul" in ot) or ("ก.ค." in ot) or ("กรกฎาคม" in ot) or ("កក្កដា" in ot) or ("ဇူလိုင္၊" in ot) or ("ဇူလိုင်" in ot) or ("ກໍລະກົດ" in ot) or ("Luglio" in ot):
month_time = '07'
elif ("AUG" in ot) or ("Aug" in ot) or ("ส.ค." in ot) or ("สิงหาคม" in ot) or ("សីហា" in ot) or ("ၾသဂုတ္၊" in ot) or ("ဩဂုတ်" in ot) or ("ြဂုတ်" in ot) or ("ສິງຫາ" in ot) or ("Agosto" in ot):
month_time = '08'
elif ("SEP" in ot) or ("Sep" in ot) or ("ก.ย." in ot) or ("กันยายน" in ot) or ("កញ្" in ot) or ("စက္တင္ဘာ၊" in ot) or ("စက်တင်ဘာ" in ot) or ("ກັນຍາ" in ot) or ("Settembre" in ot):
month_time = '09'
elif ("OCT" in ot) or ("Oct" in ot) or ("ต.ค." in ot) or ("ตุลาคม" in ot) or ("តុលា" in ot) or ("Okt" in ot) or ("ေအာက္တိုဘာ၊" in ot) or ("အောက်တိုဘာ" in ot) or ("ຕຸລາ" in ot) or ("Ottobre" in ot):
month_time = '10'
elif ("NOV" in ot) or ("Nov" in ot) or ("พ.ย." in ot) or ("พฤศจิกายน" in ot) or ("វិច្ឆិកា" in ot) or ("ႏိုဝင္ဘာ၊" in ot) or ("နိုဝင်ဘာ" in ot) or ("ພະຈິກ" in ot):
month_time = '11'
elif ("DEC" in ot) or ("Dec" in ot) or ("ธ.ค." in ot) or ("ธันวาคม" in ot) or ("ធ្នូ" in ot) or ("Dez" in ot) or ("ဒီဇင္ဘာ၊" in ot) or ("ဒီဇင်ဘာ" in ot) or ("ທັນວາ" in ot) or ("Dicembre" in ot):
month_time = '12'
return month_time