python爬取热搜神器(可以查找关键字热搜or过去的热搜)
hello,因为老师给了任务,希望我们爬取一些微博上的数据,所以就想到了要爬取热搜,再根据热搜爬取评论。因为微博对过往的热搜不能根据时间进行搜索,因此这里笔者找到了一个微信公众号–热搜神器
点击历史热搜就可以看到之前某一天的热搜。但是好像要用积分兑换,我登录注册了一下用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就可以!!!
注意右边的箭头!!!Edge出不来这个accessToken,所以总是不能成功!!
找了半天原因人都要崩溃了
原来在这里!!!
主要就是这样啦,这样就可以爬取成功了~
最后都把他保存下来就可以做进一步的处理操作了~