基于Requests和Ajax分析法的新浪微博关键词采集
1 项目介绍
本项目介绍使用requests模块和Ajax分析法采集微博关键词的方法。
本项目仅以“杨幂”、郑爽 、“赵丽颖”这三个关键词挖掘举例说明,如果有挖掘微博其他关键词的需求,可以更换关键词进行采集。
目标:
- 搜索关键词,如#赵丽颖#,采集底下的微博
- 采集微博用户的性别、地点、院校、标签、行业、公司、简介等信息
- 采集关键词的搜索结果微博内容(以电影举例),可分析电影的舆情评价、观影人群画像制作等
2 技术要点
-
文本循环
-
Ajax点击
3 实现步骤
3.1 搜索微博内容爬取
import requests
def get_hot_info(kw, page):
"""
获取热搜文章信息
:param kw: 搜索关键字
:return: 搜索的文章
"""
# 使用在线URL解码器进行解码, 如下:
# https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E4%BA%92%E8%81%94%E7%BD%91&page_type=searchall
# 微博的url基本地址
url = "https://m.weibo.cn/api/container/getIndex"
# url访问需要添加的参数
params = {
'containerid': '100103type=1&q=%s' % (kw),
'page': page
}
# 获取页面内容,并通过ijson解析返回一个字典;
hot_infos = requests.get(url, params).json()
# 提取需要的微博热搜正文内容
hot_cards = hot_infos['data']['cards']
infos = []
for card in hot_cards:
for text in card['card_group']:
if text.get('mblog'):
infos.append(text['mblog']['text'])
return infos
3.2 数据清洗
def data_cleaning(text):
"""
微博数据的清洗
:param text: 需要清洗的内容, 提取需要的中文
:return:
"""
import re
pattern = '([\u4e00-\u9fa5])'
cleanData = "".join(re.findall(pattern, text))
return cleanData
3.3 持久化保存数据
def persistent_data(kw='996', filename='./data/996.txt', page=5):
"""
持久化保存爬取数据到文件中, 便于数据清洗于数据分析;
:param kw: 搜索的关键字
:param filename: 存储的文件位置
:param page: 爬取关键字微博信息的个数
:return:
"""
f = open(filename, 'w')
for page in range(page):
print(str(page).center(50, '*'))
print("正在爬取第%d页" % (page + 1))
infos = get_hot_info(kw, page + 1)
for info in infos:
info = data_cleaning(info)
f.write(info + '\n')
3.4 词云展示分析
def wordcloud_analyze(filename, pngFile='./data/mao.jpg', savePngFile='./data/程序员.png'):
"""
词云分析
:param filename:
:return:
"""
import jieba
import wordcloud
import numpy as np
from PIL import Image
# 打开图片
imageObj = Image.open( pngFile)
cloud_mask = np.array(imageObj)
wc = wordcloud.WordCloud(
background_color='snow', # 背景颜色
font_path='/usr/share/fonts/wqy-microhei/wqy-microhei.ttc', # 处理中文数据时
min_font_size=5, # 图片中最小字体大小;
max_font_size=100, # 图片中最大字体大小;
margin=2,
mask=cloud_mask,
)
f = open(filename)
results = ''
for line in f:
line = line.strip()
result = jieba.lcut(line)
results += (",".join(result))
# print(results)
wc.generate(results)
wc.to_file( savePngFile)
4 完整代码及效果展示
- 完整代码
import requests
def get_hot_info(kw, page):
"""
获取热搜文章信息
:param kw: 搜索关键字
:return: 搜索的文章
"""
# 使用在线URL解码器进行解码, 如下:
# https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E4%BA%92%E8%81%94%E7%BD%91&page_type=searchall
# 微博的url基本地址
url = "https://m.weibo.cn/api/container/getIndex"
# url访问需要添加的参数
params = {
'containerid': '100103type=1&q=%s' % (kw),
'page': page
}
# 获取页面内容,并通过ijson解析返回一个字典;
hot_infos = requests.get(url, params).json()
# 提取需要的微博热搜正文内容
hot_cards = hot_infos['data']['cards']
infos = []
for card in hot_cards:
for text in card['card_group']:
if text.get('mblog'):
infos.append(text['mblog']['text'])
return infos
def persistent_data(kw='996', filename='./data/996.txt', page=5):
"""
持久化保存爬取数据到文件中, 便于数据清洗于数据分析;
:param kw: 搜索的关键字
:param filename: 存储的文件位置
:param page: 爬取关键字微博信息的个数
:return:
"""
f = open(filename, 'w')
for page in range(page):
print(str(page).center(50, '*'))
print("正在爬取第%d页" % (page + 1))
infos = get_hot_info(kw, page + 1)
for info in infos:
info = data_cleaning(info)
f.write(info + '\n')
def data_cleaning(text):
"""
微博数据的清洗
:param text: 需要清洗的内容, 提取需要的中文
:return:
"""
import re
pattern = '([\u4e00-\u9fa5])'
cleanData = "".join(re.findall(pattern, text))
return cleanData
def wordcloud_analyze(filename, pngFile='./data/mao.jpg', savePngFile='./data/程序员.png'):
"""
词云分析
:param filename:
:return:
"""
import jieba
import wordcloud
import numpy as np
from PIL import Image
# 打开图片
imageObj = Image.open( pngFile)
cloud_mask = np.array(imageObj)
wc = wordcloud.WordCloud(
background_color='black', # 背景颜色
font_path='/usr/share/fonts/wqy-microhei/wqy-microhei.ttc', # 处理中文数据时
min_font_size=5, # 图片中最小字体大小;
max_font_size=100, # 图片中最大字体大小;
margin=2,
mask=cloud_mask,
)
f = open(filename)
results = ''
for line in f:
line = line.strip()
result = jieba.lcut(line)
results += (",".join(result))
# print(results)
wc.generate(results)
wc.to_file( savePngFile)
if __name__ == '__main__':
kw = '程序员'
filename = './data/%s.txt' % (kw)
page = 100
# persistent_data(filename=filename, page=page)
wordcloud_analyze(filename)
- 效果展示