根据关键词爬取历史微博热搜

  • 写在最前一些废话
  • 爬虫
  • jieba处理


写在最前一些废话

写这个主要是记录学习,这个代码比较简单,大部分参考了别人的代码,主要是加一些备注以及添加一些东西。

爬虫

先扔一下代码再解释:

import json
import requests
import time
import pandas as pd
from http.cookies import SimpleCookie

## 设置headers和cookie,数据爬取
headers ={'User-Agent':'自己的header别不知道啊'}
raw_cookie= '自己的cookie我想你找得到,复制粘贴就行'

#cookie从字符串转换为可以使用的
cookie = SimpleCookie(raw_cookie)
requests_cookies = dict([(c, cookie[c].value) for c in cookie])

def stampToTime(stamp): #时间转换
    datatime = time.strftime("%Y-%m-%d",time.localtime(float(str(stamp)[0:10])))
    return datatime

resou = pd.DataFrame(columns=['datetime','title','searchCount'])

for i in range(1,131):#这个131别照抄啊,计算得知的
    url= 'https://www.enlightent.cn/research/top/getWeiboRankSearch.do?keyword=肺炎&from='+ str(i) +'&t=你自己的&accessToken=你自己的'
    #非常明显是不是?肺炎是关键词,换成你的,后面的也换!
    html = requests.get(url=url, cookies=requests_cookies, headers=headers).content
    data = json.loads(html.decode('utf-8'))
    
    if(i==131):
        for j in range(11): #一页20个
            print(j)
            resou = resou.append({'datetime':stampToTime(data['rows'][j]['updateTime']),
                    'title':data['rows'][j]['keywords'],'searchCount':data['rows'][j]['searchNums'],
                                  },ignore_index=True)
    else:
        for j in range(20): #一页20个,这个别改哦
            resou = resou.append({'datetime':stampToTime(data['rows'][j]['updateTime']),
                    'title':data['rows'][j]['keywords'],'searchCount':data['rows'][j]['searchNums'],
                                  },ignore_index=True)
resou.to_csv("resou-肺炎.csv", index_label="index_label",encoding='utf-8-sig')



resou_dt = resou.groupby('datetime',as_index=False).agg({'searchCount':['mean']})
resou_dt.columns = ['date','avg_count']

## 绘制日历图
from pyecharts import options as opts
from pyecharts.charts  import Calendar
data = [
        [resou_dt['date'][i], resou_dt['avg_count'][i]]
        for i in range(resou_dt.shape[0])
    ]

calendar = (
        Calendar(init_opts=opts.InitOpts(width='1800px',height='1500px'))
        .add("", data,calendar_opts=opts.CalendarOpts(range_=['2019-12-01', '2020-11-23']))
        .set_global_opts(
        #这个标题应该不要我多说
            title_opts=opts.TitleOpts(title="肺炎2019-12-01起每日热搜平均指数",pos_left='15%'),
            visualmap_opts=opts.VisualMapOpts(
                max_=3600000,
                min_=0,
                orient="horizontal",
                is_piecewise=False,
                pos_top="230px",
                pos_left="100px",
                pos_right="10px"
            )
            )
        .render('肺炎日期热力图.html')     
     )
  1. 首先 ,是这个包,注意我关键词已经写了且搜了;
  2. python 爬取新浪微博热门榜单 用python爬取微博热搜_html

  3. 直接拉到最后,这个数据合成的URL,自己填上。也可以复制一下ULR看看页面。
  4. python 爬取新浪微博热门榜单 用python爬取微博热搜_爬虫_02

  5. 顺便一提,当from大于所展示的所有但是有没有特别离谱的时候,就可以直接看见一个row是空的只有总数的页面,这就是所提到计算得知的东西
  6. 注意该网站要会员才能全部查看,要是你的只有几条,没会员而已;

jieba处理

对不起,犯懒了,好像这真的没什么要点…

import pandas as pd
import jieba.posseg as posseg
import json
import requests
data=pd.read_csv("F:\\201网络爬虫\\resou-肺炎.csv")
counts={}
for i in range(2640):
    words=posseg.lcut(data['title'][i]) # 搜索引擎模式
    #print(type(words))
    for word,flag in words:
        if(flag=='ns' and len(word)!=1):
            #print(word, flag)
            counts[word] = counts.get(word, 0) + 1    #遍历所有词语,每出现一次其对应的值加1         
items = list(counts.items())
#lambda是一个隐函数,是固定写法
#不懂的话看看这个!
#
items.sort(key=lambda x: x[1], reverse=True)    #根据词语出现的次数进行从大到小排序

for i in range(len(items)):
    w,n=items[i]
    dt=dt.append({'location':w,'times':n},ignore_index=True)

dt.to_csv("F:\\201网络爬虫\\resou-肺炎-地区.csv")

#疫情:2687
#新冠:4954
#肺炎:2641
#人名
#地区

items.sort(key=lambda x: x[1], reverse=True)这句不懂的话可以看看这篇,我觉得人家写的够好了(偷懒)