代码部分

代码部分

编辑于2020/3/29

步骤是:从热搜神器上获取数据,此时数据是有很多无用信息的(比如一些超链接),对数据进行处理,导出到excel。

  1. ** 获取数据**

使用的是requests包,先定义对目标网站访问时发出的请求中包含的部分信息,包括url,headers等,以下省去了与本机相关的信息,这些在浏览器中可以查看。

url = 'https://www.enlightent.cn/research/top/getWeiboHotSearchDayAggs.do'
headers = {'User-agent':'*****',
      "Cookie":"*****",
      "Connection":"close"}
data = {
      'type': 'realTimeHotSearchList',
      't': '151385084',
      'accessToken': 'HYfcS6EQ3JyJCSxU6P/sQmb5KVLIm4qbIxRCEInE6RIr4TnHJtYG0F2ZOCqIjuWiQkhLjXVPYoQPGUKlpyvVfg==',
      'date': date_str#改变日期以获取一段时间内的热搜词条
      }

date_str的意思见第四部分:循环
该网站拉黑了我的ip,因此需要设置代理ip,网上有很多代理ip商,这里使用的是快代理的独享代理。

proxies = {
    "http": "*******"
    }

发送请求,获取数据:

	r = requests.get(url, proxies=proxies, headers=headers)
    # 发送post请求
    r = requests.post(url, data=data, headers=headers)
    result = r.content.decode('utf-8')#解码成汉字,这里的result是一长串字符串,进行分片
    #获取到的字符串进行分片,此时result由一长串字符串变成列表
    result = result.split('},{')
    #去除首部两个字符以便后面的正则匹配,这里视具体情况而定
    result[0] = result[0].strip('[{')

这样就得到了某一天的热搜词组成的列表,就像这样:
[{“keyword”:“谢娜的主持”,“url”:“http://s.weibo.com/weibo?q=%23%E8%B0%A2%E5%A8%9C%E7%9A%84%E4%B8%BB%E6%8C%81%23”,“count”:19,“searchCount”:12897968,“rank”:1},{“keyword”:“跨年”,“url”:“http://s.weibo.com/weibo?q=%23%E8%B7%A8%E5%B9%B4%23”,“count”:44,“searchCount”:6134135,“rank”:1},{“keyword”:“敢于真实 做时间的朋友”,“url”:“http://s.weibo.com/weibo?q=%23%E6%95%A2%E4%BA%8E%E7%9C%9F%E5%AE%9E+%E5%81%9A%E6%97%B6%E9%97%B4%E7%9A%84%E6%9C%8B%E5%8F%8B%23”,“count”:11,“searchCount”:5057810,“rank”:3},{“keyword”:“武汉发现不明原因肺炎”,“url”:“http://s.weibo.com/weibo?q=%23%E6%AD%A6%E6%B1%89%E5%8F%91%E7%8E%B0%E4%B8%8D%E6%98%8E%E5%8E%9F%E5%9B%A0%E8%82%BA%E7%82%8E%23”,“count”:51,“searchCount”:4685637,“rank”:1}]

  1. 处理数据
    取出汉字,使用正则匹配:
#获取数据的文字部分(热搜词条)
def GetMiddleStr(content,startStr,endStr):
   patternStr = r'%s(.+?)%s'%(startStr,endStr)
   p = re.compile(patternStr,re.IGNORECASE)
   m= re.match(p,content)
   if m:
       return m.group(1)

调用时:

while j<len(result):
        final_list.append(GetMiddleStr(result[j], '"keyword":"','","url"'))#final_list是全局列表
        j+=1

然后把取出的词条添加到一个全局列表中
3. 导出数据

def export(result_list):
    excel = open('微博热搜历史备用.xlsx', 'w', encoding='gbk')
    for a in result_list:#这里\xa0的存在会报错,因此替换为空格
        excel.write(a.replace(u'\xa0', u' '))
        excel.write('\n')
    excel.close()

调用时:

export(final_list)#final_list是一个全局列表
  1. 循环
    以上只能获取一天的数据,要想获取一段时间内,必须创建一个日期循环,首先获取日期列表:
#获取要爬取的日期列表
def gen_dates(b_date, days):
    day = timedelta(days=1)
    for i in range(days):
        yield b_date + day*i
def get_date_list():
    """
    获取日期列表
    :param start: 开始日期
    :param end: 结束日期
    :return:
    """
    start = datetime.strptime("2019-12-31", "%Y-%m-%d").date()
    #.date()可以只截取日期
    end = datetime.now().date()
    datelist = []
    for d in gen_dates(start, (end-start).days):
        datelist.append(d)
    return datelist

调用时:

date_str = str(get_date_list()[i].year)+'/'+str(get_date_list()[i].month)+'/'+str(get_date_list()[i].day)

date_str作为data的一个参数

扫描二维码关注公众号,回复: 10635596 查看本文章
  1. 完整代码
# 调用要使用的包
from datetime import datetime,timedelta
import re
from openpyxl import Workbook
import requests

workbook = Workbook()
url = 'https://www.enlightent.cn/research/top/getWeiboHotSearchDayAggs.do'
headers = {'User-agent':'*****',
        "Cookie":"*****",
        "Connection":"close"}
proxies = {
    "http": "47.101.40.143:16819"
    }

#获取要爬取的日期列表
def gen_dates(b_date, days):
    day = timedelta(days=1)
    for i in range(days):
        yield b_date + day*i
def get_date_list():
    """
    获取日期列表
    :param start: 开始日期
    :param end: 结束日期
    :return:
    """
    start = datetime.strptime("2019-12-31", "%Y-%m-%d").date()
    #.date()可以只截取日期
    end = datetime.now().date()
    datelist = []
    for d in gen_dates(start, (end-start).days):
        datelist.append(d)
    return datelist

#获取数据的文字部分(热搜词条)
def GetMiddleStr(content,startStr,endStr):
    patternStr = r'%s(.+?)%s'%(startStr,endStr)
    p = re.compile(patternStr,re.IGNORECASE)
    m= re.match(p,content)
    if m:
        return m.group(1)

#导出数据到excel
def export(result_list):
    excel = open('微博热搜历史备用.xlsx', 'w', encoding='gbk')
    for a in result_list:
        excel.write(a.replace(u'\xa0', u' '))
        excel.write('\n')
    excel.close()

#两个循环,外层是日期,内层是热搜
i = 0
j = 0
#存储结果的列表
final_list = []

while i<len(get_date_list()):
    date_str = str(get_date_list()[i].year)+'/'+str(get_date_list()[i].month)+'/'+str(get_date_list()[i].day)
    data = {
        'type': 'realTimeHotSearchList',
        't': '151385084',
        'accessToken': 'HYfcS6EQ3JyJCSxU6P/sQmb5KVLIm4qbIxRCEInE6RIr4TnHJtYG0F2ZOCqIjuWiQkhLjXVPYoQPGUKlpyvVfg==',
        'date': date_str
        }
    r = requests.get(url, proxies=proxies, headers=headers)
    # 发送post请求
    r = requests.post(url, data=data, headers=headers)
    result = r.content.decode('utf-8')
    print(i)
    #获取到的字符串进行分片,此时result由一长串字符串变成列表
    result = result.split('},{')
    #去除首部两个字符以便后面的正则匹配
    result[0] = result[0].strip('[{')
    j = 0
    while j<len(result):
        final_list.append(GetMiddleStr(result[j], '"keyword":"','","url"'))
        j+=1
    i+=1
export(final_list)
发布了2 篇原创文章 · 获赞 0 · 访问量 10

猜你喜欢

转载自blog.csdn.net/weixin_46660582/article/details/105174366
今日推荐