python爬取热搜神器(可以查找关键字热搜or过去的热搜)

hello,因为老师给了任务,希望我们爬取一些微博上的数据,所以就想到了要爬取热搜,再根据热搜爬取评论。因为微博对过往的热搜不能根据时间进行搜索,因此这里笔者找到了一个微信公众号–热搜神器

android热搜 历史搜索 如何搜索历史热搜_爬虫


点击历史热搜就可以看到之前某一天的热搜。但是好像要用积分兑换,我登录注册了一下用100积分换了七天能查阅的时间,所以就抓紧时间开始写这个博客啦~~

话不多说~我们开始吧

引入库

这里就不做介绍了,主要还是用requests库,还用到了正则表达式,xlwt等,都是比较基础的库

from datetime import datetime,timedelta
import re
import requests
import xlwt

设置headers

这里主要是cookie,和之前爬取微博一样需要登录信息,因为他是会员才能看历史热搜

cookie ='这里自己去找哟'
headers = {'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19041',
        "Cookie":cookie}

获取日期列表

这里其实是我从某个博主那里找的,但是他的不能爬到之前的内容,我相当于是对他的代码改了一下,但是我已经找不到他的博客在哪里了,麻烦作者如果看到了联系我一下~~感谢

def gen_dates(b_date, days):
    day = timedelta(days=1)
    for i in range(days):
        yield b_date + day*i
def get_date_list():
    #这里自己设置时间~因为我要爬的是今年的热搜所以就
    start = datetime.strptime("2019-12-31", "%Y-%m-%d").date()
    #.date()可以只截取日期
    end = datetime.strptime("2020-11-3", "%Y-%m-%d").date()
    datelist = []
    for d in gen_dates(start, (end-start).days):
        datelist.append(d)
    return datelist

获取热搜及其网址

因为下面爬取的网页其实是一个json网页,所以格式比较好解析,但是因为我太懒了所以就用了原作者的方式,没有用到json,用的是re去对爬到的数据做了一个处理,保存的东西我们也不太一样,所以做了一个改变。

#获取数据的文字部分(热搜词条)和链接(我只需要这两个)
def GetMiddleStr(final_set,content,time):
    try:
        wenzi = re.search('word":".*","url',str(content)).group(0).replace('word":"','').replace('","url','')
        url = re.search('"url":".*","count"',str(content)).group(0).replace('"url":"','').replace('","count"','')
        final_set.add((url,wenzi,time))
    except:
        return 0

存储到文件中

这个其实跟之前写的没什么区别,只不过是把我之前文章的list换成了set,因为之前爬热搜发现有的时候热搜有可能会重复,为了方便处理所以用了set

def export(result_set,date_str):
    excel = xlwt.Workbook(encoding="utf-8")
    sheet = excel.add_sheet("sheet1")
    sheet.write(0, 0, "网址")
    sheet.write(0, 1, "热搜")

    ex = 'D:/weibo/hot_past/'+date_str.replace('/','_')+'.xls'
    i = 0
    for t in result_set:
        sheet.write(i + 1, 0, t[0])
        sheet.write(i + 1, 1, t[1])
        i += 1
    excel.save(ex)

最后的main函数啦(这里有个非常要注意的地方,成败在此一举???)

函数别的地方没什么好说的,先贴代码再分析

def main():
    final_set = set()
    url = 'https://www.enlightent.cn/research/top/getWeiboHotSearchDayAggs.do'
    for i in range(len(get_date_list())):
        date_str = str(get_date_list()[i].year)+'/'+str(get_date_list()[i].month)+'/'+str(get_date_list()[i].day)
        print(date_str)
        data = {
            'type': 'realTimeHotSearchList',
            't': '嘤嘤嘤',
            #我可真厉害
            'accessToken':'就是这里,看这看这看这!!!!!!',
            'date': date_str
            }

        r = requests.post(url, data=data, headers=headers)
        result = r.content.decode('utf-8')
        print(result)
        #获取到的字符串进行分片,此时result由一长串字符串变成列表
        result = result.split('},{')
        #去除首部两个字符以便后面的正则匹配
        result[0] = result[0].strip('[{')
        for j in range(len(result)):
            GetMiddleStr(final_set,result[j],date_str)
        export(final_set,date_str)
        final_set = set()
        
if __name__ =="__main__":
    main()

不得不说还是谷歌浏览器比较香,之前用Edge,明明改了cookie但却还是不能爬历史的页面,但是google就可以!!!

android热搜 历史搜索 如何搜索历史热搜_字符串_02

注意右边的箭头!!!Edge出不来这个accessToken,所以总是不能成功!!

找了半天原因人都要崩溃了

原来在这里!!!

主要就是这样啦,这样就可以爬取成功了~

android热搜 历史搜索 如何搜索历史热搜_字符串_03


最后都把他保存下来就可以做进一步的处理操作了~