爬虫实战|嚣张的徽州宴老板娘错在哪?
本文作者:王玉婷,中南财经政法大学金融学院
本文编辑:刘子艳
技术总编:戴 雯
Stata&Python云端课程来啦!
为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~原价2400元的Python编程培训课程,现在仅需100元,详情请查看推文《Python云端课程福利大放送!0基础也能学~》。关于Stata,爬虫俱乐部推出了系列课程,内容包括字符串函数、正则表达式、爬虫专题和文本分析,可以随心搭配,价格美丽,物超所值,更多信息可查看Stata系列推文《与春天有个约会,爬虫俱乐部重磅推出正则表达式网络课程!》、《与春天有个约会,爬虫俱乐部重磅推出基本字符串函数网络课程》等。变的是价格,不变的是课程质量和答疑服务。对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦!
01
分析网页
首先,我们在微博首页搜索关键词“徽州宴”,选择两个热度最高的相关话题#徽州宴道歉会得到原谅吗#和#叫嚣狗比人值钱女子为徽州宴老板娘#。我们以第一个话题的评论页为例,分析其url链接的规律,使用循环快速“拿下”所有评论。
打开开发者Network页面,选择XHR
,其中buildComments
就是评论文件。如下图所示:
buildComments
文件。观察该文件的链接:>"https://weibo.com/ajax/statuses/buildComments?is_reload=1&id=4656364468570597&is_show_bulletin=2&is_mix=0&count=20&uid=2686904145">"https://weibo.com/ajax/statuses/buildComments?flow=0&is_reload=1&id=4656364468570597&is_show_bulletin=2&is_mix=0&max_id=141326698244575&count=20&uid=2686904145"
max_id
参数。根据我们之前的文章《【爬虫实战】“中国人不吃这一套”——人民日报微博评论分析》可以知道,这个参数就在每个buildComments
文件的前一个评论文件中。如下图所示: 到此,我们就理出头绪了,我们从第一个buildComments
文件开始,获取评论文本的同时,获得下一个buildComments
文件url链接的max_id
参数,从而不断构造下一页链接,说干就干!
02
获取数据
# 导入需要的库
import os
import requests
import time
import json
import random
#新建文件夹和文件
os.chdir(r"D:\tempro")
os.makedirs("./新浪微博评论")
os.chdir("./新浪微博评论")
file='./评论1.csv'
# 构造headers
headers={
"cookie": 你的cookie,
"referer":"https://weibo.com/2686904145/KnEiqzXBr",
"traceparent": "00-1291c7b7c4c133d6f2dca38374e24dbc-a37ea7ef4b9d3050-00",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36",
"x-requested-with": "XMLHttpRequest",
"x-xsrf-token": "8CYl7P4HLo4aqYv8FmU86H7O"
}
max_id=0 #初始参数为0
comments = [] #用于存放评论
for i in range(1,100000):
print("正在爬取第%s页"%i)
sourcecode = True
url="https://weibo.com/ajax/statuses/buildComments?is_reload=1&id=4656364468570597&is_show_bulletin=2&is_mix=0&count=20&uid=2686904145"
pars={
"max_id":max_id
}
while sourcecode:
try:
html=requests.get(url,headers=headers,params=pars) #获取链接内容
sourcecode=False
except:
time.sleep(10)
print('重新连接!')
results=json.loads(str(html.content.decode()), strict = False) #解析为字典
#获取下一个页面链接的参数
max_id = results["max_id"]
max_id = int(max_id) # 转为数字
total_number = results["total_number"] #总评论数
#从字典的子字典以及列表元素中提取所需信息
for d in results["data"]:
user_id=d["user"]["id"]
user_name=d["user"]["screen_name"]
user_gender=d["user"]["gender"]
comment=d["text_raw"]
like_count=d["like_counts"]
comments.append(comment)
comments=list(set(comments)) #有重复的max_id,去重
print("已输出%s条评论" %len(comments))
if len(comments) == total_number:
break
time.sleep(random.random()*3)
#导出到csv文件
comments = "".join(comments)
with open(file,'w',encoding='utf-8') as f:
f.write(comments)
f.close()
获得的评论文件csv如下图所示:03
评论词云
在之前的推文中,我们多次介绍过词云的构造方法,现在我们再复习一遍。
第一步:导入评论文本,清洗文本。
import matplotlib.pyplot as plt
import jieba
from wordcloud import wordcloud
import re
import os
os.chdir(r"D:\tempro")
os.chdir("./新浪微博评论")
file='./评论1.csv'
stopfile = './all_stopwords.txt' # 停用词表
text1 = open(file, 'r', encoding='utf-8').readlines() # 导入评论文本
text = [re.sub('[^\u4e00-\u9fa5]','',te) for te in text1] # 清洗文本,只保留汉字
text = ''.join(text) # 将上述评论列表转换为一个字符串以便分词
第二步:分词并整理 text_cut = jieba.lcut(text) # 使用jieba库做中文分词
stopwords = [word.strip() for word in open(stopfile,'r',encoding='utf-8').readlines()] # 导入停用词表
# 去掉分词后得到的单字
def drop_oneword(contents):
ex_oneword = []
for word in contents:
if len(word) == 1:
continue
ex_oneword.append(word)
return ex_oneword
text_cut = drop_oneword(text_cut) #去掉单字
text_cut = ' '.join(text_cut)
上述程序运行结果如下:
第三步:生成词云。
此时,我们发现上述分词后还有“这个”、“这么”等无实际意义的词汇,这将在词云的生成过程中得到控制。
wc = wordcloud.WordCloud(
font_path='./simsun.ttc', # 使用的字体,可以从c盘的fonts文件夹任意选取并复制粘贴至该工作路径。
background_color='white',
width=800,
height=600,
max_words=200,
max_font_size=100,
mask=plt.imread('./盘子.jpg'), # 导入背景图,最好是黑白配色;文件大小和分辨率太小的图片不能做背景图
stopwords = stopwords # 去除停用词
)
wc.generate(text_cut) # 生成词云
wc.to_file('./词云.png') # 保存词云图
plt.imshow(wc)
plt.axis('off')
plt.show()
生成的词云如下图所示:
最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。
对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
如何获取衡量股民情绪的指标?|东方财富股吧标题爬虫
利用Python构建马科维茨有效边界
rangestat,让统计量灵活滚动起来!
听说这样做立项成功率更高哦
如何处理缺失值?这一篇搞定!
善用dataex命令,高效沟通你我他
大数据下的大学分数线排行榜,快来围观!
《觉醒年代》—带你回到百年前
用Stata画的三维图很奇怪怎么办?
如何随机生成满足特定数据特征的新变量?
爬取无法翻页网页——自然科学基金项目及可视化
爬取京东评论数据进行情感分类
Stata与音乐之间的酷炫连接
这些年,爬虫俱乐部走出的博士们!看这里,近五年各校高被引论文上榜名单!
高校经管类核心期刊发文排行榜
疯狂的科研创新加速器——Stata!
可盐可甜,“粽”有所爱,快来pick你最爱的粽子吧!
好玩有趣的手绘图形库——cutecharts
爬虫实战|摩尔庄园微博话题讨论
一季度财报出炉,哪些公司最烧钱?
一季度财报出炉,哪些公司最赚钱?
技能篇 | 图片合并大法
批量空气质量数据文件合并分析
Stata17之日期时间新功能
Stata17之Lasso新功能
爱奇艺视频弹幕爬取之《小舍得》数据可视化利器——Matplotlib关于我们
微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。