通过关键词采集文章采集api( requests模块和Ajax分析法采集微博关键词的方法分析及效果展示 )
优采云 发布时间: 2022-01-24 00:06requests模块和Ajax分析法采集微博关键词的方法分析及效果展示
)
基于Requests和Ajax分析方法的新浪微博关键词采集
1 项目介绍
本项目介绍requests模块的使用方法和ajax解析方法采集微博关键词.
本项目仅使用“杨幂”、“郑爽”、“赵丽颖”三个关键词挖掘实例。如果有需要在微博上挖其他关键词,可以替换关键词继续采集。
目标:
-搜索关键词,如#赵丽英#,微博下采集
- 采集微博用户的性别、位置、机构、标签、行业、公司、简介等
-采集关键词搜索结果的微博内容(以电影为例),可以分析电影的舆论评价,拍影迷画像等。
2技术点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)