一、准备工作
打开微博网址
进入之后,正常登陆微博账号,然后就可以对评论内容
进行抓包处理了。
进行抓包的时候,可能还有一个小插曲。
首先,随便选一则内容,点击评论
,然后下拉点击查看全部评论
紧接着进行抓包,在这个过程,你可能需要进行手机号验证。出现手机号验证的画面,进行验证就可以了。
二、思路分析
通过抓包分析,可以发现列表中,以 buildComments
开头的包,里面包含的就是我们需要的评论信息。
哎呀,这不就是之前经常爬取的json
数据嘛。
这就需要构造请求链接了。
目标链接由以下链接加上一些参数构成:
https://weibo.com/ajax/statuses/buildComments
参数可以通过点击这里查看。
比如参数如下:
flow: 0
is_reload: 1
id: id
is_show_bulletin: 2
is_mix: 0
max_id: max_id
count: 20
uid: uid
其中:id
和uid
需要根据微博内容进行更换的,max_id
是通过上一个包获取的,第一个包为0.
则构成的目标链接为:
https://weibo.com/ajax/statuses/buildComments?flow=0&is_reload=1&id=id&is_show_bulletin=2&is_mix=0&max_id=max_id&count=20&uid=uid
三、数据获取
主要部分包括以下几个,具体可见源码:
- 根据微博链接得到id和uid
- 发起请求,返回json数据
- 返回评论信息
- 保存评论信息
- 设置一个循环,循环爬取
import requests
import json
from fake_useragent import UserAgent
from pyquery import PyQuery as pq
import os
import pandas as pd
ua = UserAgent(verify_ssl=False, path='D:/Pycharm/fake_useragent.json')
# 随机生成请求头
def ua_random():
headers = {
'use_agent': ua.random
}
return headers
# 根据微博链接得到id和uid
def get_id_uid(url):
id = url.split('/')[-1]
uid = url.split('/')[-2]
return id, uid
# 发起请求,返回json数据
def scrap_json(id, uid, max_id):
url = 'https://weibo.com/ajax/statuses/buildComments'
params = {
'flow': 0,
'is_reload': 1,
'id': id,
'is_show_bulletin': 2,
'is_mix': 0,
'max_id': max_id,
'count': 20,
'uid': uid
}
response = requests.get(url=url, headers=ua_random(), params=params).text
datas = json.loads(response)
return datas
# 返回评论信息和下一页的相关参数max_id
def scrap_index(datas):
data = datas['data']
max_id = datas['max_id']
# 新建一个列表,用于放每一个完整的评论信息
comment = []
for item in data:
# 评论者昵称
user_name = item['user']['name']
# 评论者设置的地点
user_city = item['user']['location']
# 进行判断,该微博是否能够查看ip信息
if 'source' in data:
# 评论时所在地点
user_location = pq(item['source']).text()
else:
user_location = '无法显示'
# 评论时间
user_time = item['created_at']
# 评论内容
user_content = item['text_raw']
# 点赞数
user_love = item['like_counts']
# 将信息组成一个列表,形成一个完整的评论信息
user_data = [user_name, user_city, user_location, user_time, user_content, user_love]
print(f'正在保存{user_name}的评论信息')
# 将每一个完整的评论信息添加到总列表
comment.append(user_data)
return comment, max_id
# 保存评论信息
def save_data(path, filename, data):
dataframe = pd.DataFrame(data)
dataframe.to_csv(path+filename+'.csv', encoding='utf_8_sig', mode='a', index=False, sep=',', header=False)
def main():
# 创建保存文件的路径
path = 'D:/微博评论/'
if not os.path.exists(path):
os.makedirs(path)
# 文件名
filename = input("请输入文件名:")
# 写入文件列名
csv_header = [['评论者昵称', '评论者所在城市', '评论时的ip城市', '评论时间', '评论内容', '评论的点赞数']]
save_data(path, filename, csv_header)
# 获取微博id和微博用户id
url = input('请将需要爬取的微博链接粘贴至此:')
id, uid = get_id_uid(url)
max_id = 0
# 开始循环,不断获取评论信息
while True:
data_json = scrap_json(id, uid, max_id)
comment, max_id = scrap_index(data_json)
# 保存评论信息
save_data(path, filename, comment)
# 终止循环的条件,最后一个包得到的max_id是0
if max_id == 0:
break
if __name__ == '__main__':
main()
- 对于fake_useragent不理解的小伙伴,可以参考:
Python爬虫有用的库:fake_useragent,自动生成请求头四、结果展示
五、说明
- 本文仅用于交流学习
- 不建议抓取太多数据,容易对服务器造成负载,浅尝辄止即可。
- 本文利用 Python 爬虫一键保存微博评论,实现过程中也会遇到一些问题,多思考和调试,最终解决问题,也能理解得更深刻。
- 代码可直接复制运行,如果觉得还不错,记得给个赞哦,也是对作者最大的鼓励,不足之处可以在评论区多多指正。
- 本文并没有爬取对评论的回复内容,即“楼中楼”信息没有爬取