Scrapy Python爬虫实战:抓取知乎问题下所有回答!

今天趁摸鱼的时候玩了会知乎,突然看到一个非常有意思的话题

单身狗不知道还能干什么,所以特地把这些数据都抓下来,看看不除了第二杯半价还能干什么?

创建scrapy项目

前面教程概念讲的我嘴都麻了,估计大家看得也快烦死了,

直接进入主题吧!

项目创建完成结构如下:

需求分析

我们的目标很简单,抓取知乎该话题下的所有评论、作者、首页

评论点赞数和评论时间并将其保存做可视化分析

网页分析

F12点击查看网页源码,所有评论信息如下:都在一个名为data的数据文件中存储。

所以第一步我们需要先获取该文件从而获取我们所需信息

item定义

上面已经分析出我们的5个需求,我们在items.py中定义如下:

# 作者首页

photo = scrapy.Field()

# 作者名称

name = scrapy.Field()

# 评论时间

cmt_time = scrapy.Field()

# 评论点赞数

stars = scrapy.Field()

# 评论内容

comments = scrapy.Field()


发送请求

找到网页请求的真实链接,如下:

然后我们使用scrapy在spider_zhihu.py文件中发送请求

defparse(self, response):

zhihu_data = response.json()

ic(zhihu_data)

可以看到,我们已经成功的获取到了该json格式数据集

但是我们的数据是存储在data列表中的,所以我么还需进一步获取到data列表才能获取到目标数据

forzhinzhihu:

# 作者首页

item['photo'] ='https://www.zhihu.com/people/'+ zh['author']['member']['url_token']

# 作者名称

item['name'] = zh['author']['member']['name']

# 评论时间

cmt_time  = zh['created_time']

item['cmt_time'] = time.strftime('%Y-%m-%d %H:%M', time.localtime(cmt_time)).split(' ')[0]

# 评论点赞数

item['stars'] = zh['vote_count']

# 评论内容

item['comments'] = zh['content']

'''

ic| item: {'cmt_time': '2021-06-24',

'comments': '雨衣?那个雨衣[捂脸]',

'name': '菜鸟教程',

'photo': 'https://www.zhihu.com/people/li-shi-yi-372tian',

'stars': 484}

ic| item: {'cmt_time': '2021-06-24',

'comments': '众所周知嘛,雨衣依然是下雨天穿的衣服[蹲]',

'name': '枫叶',

'photo': 'https://www.zhihu.com/people/die-qi-hua',

'stars': 187}

ic| item: {'cmt_time': '2021-06-24',

'comments': '基本是单身狗写出来的,但凡真的谈恋爱的,不会这么做!
大家看看就得了,适合自己的才是最好的。
总之,记得适度而行!',

'name': '莫小风',

'photo': 'https://www.zhihu.com/people/mo-xiao-37-62',

'stars': 804}

ic| item: {'cmt_time': '2021-06-24',

'comments': '

她小脸胖乎乎我可喜欢,我俩从大一处到现在马上大四了。祝您和您对象也长长久久,如果没有就找一个。谢谢您! '

'

如果里面有内容容易引起误会和歧视或者可能带来风险,你可以拿出来提醒大家,而不是张口就来。谢谢您!

',

'name': '枫叶',

'photo': 'https://www.zhihu.com/people/die-qi-hua',

'stars': 402}

ic| item: {'cmt_time': '2021-06-24',

'comments': '道路千万条,安全第一条,雨衣不常备,情侣两行泪。',

'name': 'Jacob',

'photo': 'https://www.zhihu.com/people/jacob-hu',

'stars': 1405}

ic| item: {'cmt_time': '2021-06-25',

'comments': '小孩嗝屁袋',

'name': '王当心',

'photo': 'https://www.zhihu.com/people/mei-li-de-zheng-zha',

'stars': 986}

ic| item: {'cmt_time': '2021-06-26',

'comments': '现在知乎第一句不搞颜色是没有热度吗?[好奇]',

'name': 'danger soul',

'photo': 'https://www.zhihu.com/people/danger-soul-59',

'stars': 689}

'''

需求现在已经实现,我们现在要做的就是将数据抛给pipeline,让他自行去下载,这一步scrapy已经写好了,我们只需打开开关即可

ITEM_PIPELINES = {

'zhihu.pipelines.ZhihuPipeline':300,

}

多页获取

我们提取多页链接如下观察规律:

https://www.zhihu.com/api/v4/answers/1935351817/root_comments?order=normal&limit=20&offset=0&status=open

https://www.zhihu.com/api/v4/answers/1935351817/root_comments?order=normal&limit=20&offset=20&status=open

https://www.zhihu.com/api/v4/answers/1935351817/root_comments?order=normal&limit=20&offset=40&status=open

每页数据展示数目由limit=20控制;翻页参数由page控制。

所以我们多页链接构造如下:

forpageinrange(1,100+1):

url =f'https://www.zhihu.com/api/v4/answers/1935351817/root_comments?order=normal&limit=20&offset={(page-1)*20}&status=open'

数据下载

我们还是使用openpyxl将数据下载到Excel中然后做数据分析。

wb = Workbook()

ws = self.wb.active

ws.append(['作者首页','作者名称','评论时间','点赞人数','评论内容'])

line = [item['photo'], item['name'], item['cmt_time'], item['stars'], item['comments']]

ws.append(line)

wb.save('../知乎.xlsx')

数据抓取成功部分展示如下:

词云展示

我们使用stylecloud来绘图,部分代码如下:

有兴趣的小伙伴可以参考:

如何使用python实现一个优雅的词云?(超详细)

c_title = exist_col['评论内容'].tolist()

# 观影评论词云图

wordlist = jieba.cut(''.join(c_title))

result =' '.join(wordlist)

# 设置停用词

stop_words = ['的','是','看','了','你','我','吗','在','没','吗','这','不','就','人','好','有','都','什么','没有']

pic ='../img.jpg'

gen_stylecloud(text=result,

icon_name='fab fa-python',

font_path='msyh.ttc',

background_color='white',

output_name=pic,

custom_stopwords=stop_words

)

print('知乎词云图绘制成功!')

知乎词频图

这里我们使用熊猫来读取数据,并去除空行。使用jieba制作分词

有兴趣的小伙伴可以参考

让人无法拒绝的pandas技巧,简单却好用到爆!

知乎评论出现频率最高的前十个词分别如下:

# 词频设置

all_words = [wordforwordinresult.split(' ')iflen(word) >1andwordnotinstop_words]

wordcount = Counter(all_words).most_common(10)

'''

('雨衣', '思考', '一起', 'br', '对象', '捂脸', '女朋友', '可以', '一个', '就是')

(62, 58, 48, 42, 29, 28, 26, 22, 20, 18)

'''

词频图如下:

最大值62,最小值18,均值29

评论点赞最多

我们使用pandas找出点赞第一的评论如下:

# 读取数据

pd_data = pd.read_excel('../知乎.xlsx')

# 最多点赞数

max_star = pd_data[pd_data['点赞人数'] == pd_data['点赞人数'].max()]

print(max_star)

'''

作者首页   作者名称        评论时间  点赞人数                      评论内容

https://www.zhihu.com/people/jacob-hu  Jacob  2021-06-24  1405  道路千万条,安全第一条,雨衣不常备,情侣两行泪。

'''

自古人才出评论区,这话一点不差啊,

有对象的老板能给我解释这句话什么意思嘛

情感分析

我们以点赞最多评论为例分析观众对知乎的一些看法进行简单分析

我们是使用的库是SnowNLP

SnowNLP是一个基于Python的情感分析工具库,可以进行中文分词、词性标注、情感分析、文本分类、文本关键词提取等。

SnowNLP的情感值取值范围为0到1之间,值越大,说明情感倾向越积极。

# 情感分析

pinglun ='道路千万条,安全第一条,雨衣不常备,情侣两行泪。'

Sentiment_analysis = SnowNLP(pinglun).sentiments

print(Sentiment_analysis)

'''

0.19973577495669226

'''

得到的情感值为 0.19973577495669226,情感值较低

各位老湿机还是安全驾驶啊!

对此,你有什么看法?

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容