微博话题爬虫更新:支持小时级别的搜索和爬完自动停止
点击上方 月小水长 并 设为星标,第一时间接收干货推送
距离上次微博超级爬虫更新已经过去三个月了,很多人以为我放弃这个项目了,实际上我太忙(难)了。
上个周末整理了微博话题爬虫 WeiboTopicSpider,在 issue 里看到一个同学说可以支持小时级别的搜索了,我开始试试了貌似并不可以,或者说并不准确,和我很久以前尝试的一样,爬取的微博时间跨度并没有和给定的 start_time 和 end_time 范围一致,经过一番捣鼓,终于探得其中奥秘。
先来给这个微博超级爬虫仓库求个 star
https://github.com/Python3Spiders/WeiboSuperSpider

WeiboTopicScrapy(keyword=keyword,filter=1,start_time='2020-10-30-20',end_time='2020-10-29-21')实际的 start_time = 以前传入的 start_time + 8hour
实际的 end_time = 以前传入的 end_time + 1day + 8hour
严重怀疑是不是服务器不在国内,或者这个规则只对国内的使用者有生效,待确认中,麻烦美国等地的读者试一下给我反馈。
那么问题又来了,每次这样自己手动换算后再传入参数,有点麻烦,于是我将这部分逻辑也写进程序了,
def time_params_formatter(params_time, offset_day=0, offset_hour=-8):
[temp_year, temp_month, temp_day, temp_hour] = [int(e) for e in params_time.split('-')]
temp_date = datetime(year=temp_year, month=temp_month, day=temp_day, hour=temp_hour)
temp_offset = timedelta(days=offset_day,hours=offset_hour)
res_time = (temp_date + temp_offset).strftime('%Y-%m-%d-%H')
return res_time
在 WeiboTopicSpider 类内部自动做了处理
self.start_time = time_params_formatter(start_time, offset_hour=-8) # 原来是 = start_time
self.end_time = time_params_formatter(end_time, offset_day=-1, offset_hour=-8) # 原来是 = end_time
上次搜索过程就可以直观地表示为:
start_time, end_time = '2020-10-31-04', '2020-10-31-05'
if start_time>=end_time:
raise Exception('start_time 是离现在更远的那个时间,必须小于 end_time')
WeiboTopicScrapy(keyword=keyword, filter=1, start_time=start_time, end_time=start_time)
就是上面那个公式的逆过程,求出我们想要搜索的时间范围对应的真正的时间范围,话比较啰嗦,一句话,就是你在新的代码里修改 start_time,end_time='2020-10-31-04','2020-10-31-05'这一行的时候,改成你自己想要的时间范围即可,具体的细节程序自动转换。
实际的 start_time = 现在传入的 start_time 实际的 end_time = 现在传入的 end_time 还有,小时是最最最细粒度的搜索了,分钟和秒就不行了,至少我尝试了 N 次是这样。
最后,加了一个爬完自动结束的功能,在类内部加了三行代码:
if len(weibos) == 0:
print('自动结束,大概率是因为内容爬完了,也请留意是否是 cookie 失效等情况\n')
break
本次更新完结,撒花,阅读原文直达源码地址。
点击文本的 上一篇/下一篇 即可快速查看微博超级爬虫系列的其他文章。
