python scrapy 爬虫 业务全球化 解决时区问题

目标网站位于国外,如何通过爬虫,获取数据,并转出时间戳入库。

首先,为了实现业务全球化,入库时间必须要UTC +0时间。

但是由于在中国本地调试爬虫和爬取数据,网页返回的时间字符串可能是东八区的时间,不是我们需要的UTC 0时间。同时,通过python转时间戳,也是有坑的。

解决这一问题,主要参考了以下2篇博文:
http://tech.glowing.com/cn/dealing-with-timezone-in-python/

http://blog.sina.com.cn/s/blog_b09d460201018o0v.html

注意点:
1.在转换中添加时区

这时候直接使用time.mktime(dt.timetuple())看起来就是很自然的获取timestamp方法。但是我们注意到timetuple方法是直接把当前时间的年月日时分秒直接取出来的。所以这个转换过程在timetuple这个方法这一步丢了时区信息。根据timestamp的定义,正确的方法是把datetime对象利用asttimezone显式转换成UTC时间。
2.time obj –> datetime obj,方便添加时区
datetime.datetime(*time_tuple[0:6])

最终代码:
utils.py

def make_timestamp(spider, time_raw, time_format):
    # 如果在英国服务器跑,环境为online,时区其实不存在转换
    if datetime.datetime.now() == datetime.datetime.utcnow() and spider.env == 'online':
        time_tuple = time.strptime(time_raw, time_format)
        datetime_obj = datetime.datetime(*time_tuple[0:6]).astimezone(pytz.utc)
        timestamp = int(time.mktime(datetime_obj.timetuple()))
    else:
    # 东八区本地测试,需要转换时区
        time_tuple = time.strptime(time_raw, time_format)
        datetime_obj = datetime.datetime(*time_tuple[0:6]).astimezone(pytz.timezone('Asia/Shanghai'))
        timestamp = int(time.mktime(datetime_obj.timetuple()))
    return timestamp

scrapy spider文件:

date_raw = row.xpath("./td[@class='text-left']/text()").extract_first()
date = make_timestamp(self, date_raw, "%b %d, %Y")

最终在AWS 英国服务器测试时,发现datetime.datetime.now() == datetime.datetime.utcnow() 是false,原因是程序执行需要时间,导致2值相差 xx毫秒。解决的方法
1.将这2值转为timestamp去比较,没有毫秒
2.推翻上面的方法,用

time.mktime(time.strptime(date_raw, time_format))  - time.altzone

未经允许不得转载:子航个人博客,记录生活点滴 » python scrapy 爬虫 业务全球化 解决时区问题

赞 (0)
分享到:更多 ()