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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值