代码部分
编辑于2020/3/29
步骤是:从热搜神器上获取数据,此时数据是有很多无用信息的(比如一些超链接),对数据进行处理,导出到excel。
- ** 获取数据**
使用的是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}]
- 处理数据
取出汉字,使用正则匹配:
#获取数据的文字部分(热搜词条)
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是一个全局列表
- 循环
以上只能获取一天的数据,要想获取一段时间内,必须创建一个日期循环,首先获取日期列表:
#获取要爬取的日期列表
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的一个参数
- 完整代码
# 调用要使用的包
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)