【python爬虫】对于微博用户发表文章内容和评论的爬取
此博客仅作为交流学习
对于喜爱的微博用户文章内容进行爬取
(此部分在于app页面进行爬取,比较方便)
分析页面
在这里进行json方法进行,点击Network进行抓包
发现数据加载是由这个页面发出的,查看期发出的内容
页面并不是一次性加载所有内容,而是在页面下拉的时候加载出后续内容
而后点击预览即可看见我们想要的元素
开始提取网页信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | response = requests.get(url = url) data = response.json() #pprint.pprint(data) #将页面内容规范为易懂可视页面 next_url = data[ 'data' ][ 'cardlistInfo' ] card = data[ 'data' ][ 'cards' ] for card in card: #print(card) mblog = card.get( 'mblog' , None ) if mblog: # 有内容再提取 mid = mblog.get( 'mid' , None ) # id text = mblog.get( 'text' , None ) # 文章标题 source = mblog.get( 'source' , None ) # 发布平台 author_name = mblog.get( 'user' , {}).get( 'screen_name' , None ) # 发布作者 created_at = mblog.get( 'created_at' , None ) #时间 print ([text, source, author_name, mid]) |
这样就可以提取到博主发布文章的信息了
解析如何提取评论的信息,点击评论进行抓包
进入评论页面
那么我们只要在捕获博主页面后可以自动进入评论页面便好
寻找两个页面的联系,发现在博主页面的"mid"可以对于于评论链接的”mid“,那么只要捕获博主页面的"mid",并将赋予到字符串连接便可以找到对应评论
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # 微博下的评论 comments_url = 'https://m.weibo.cn/comments/hotflow?id=' + mid + '&mid=' + mid + '&max_id_type=0' # 爬取每一条数据下面的评论 requests.get(comments_url) comments_response = requests.get(comments_url) comments_data = comments_response.json() #print(comments_data) if comments_data[ 'ok' ] = = 1 : #只读取有评论微博 data_list = comments_data[ 'data' ][ 'data' ] for comment in data_list: comment_text = comment.get( 'text' , None ) comment_mid = comment.get( 'mid' , None ) username = comment[ 'user' ][ 'screen_name' ] print ([comment_mid,username,comment_text]) |
这样就可以得到博主其中一个文章的内容和其评论了
我们接下来分析每一个博主文章之间的联系,以便于我们可以的得到每一个文章的信息
下拉找寻新加载出来抓包,发现有多出来一个字符串
对比上一个包发现只要捕获上一个包的”since_id“并赋予在上一个包的地址,便是下一个包的地址了
进行函数表达
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | def start(url): response = requests.get(url = url) data = response.json() #pprint.pprint(data) #将页面内容规范为易懂可视页面 next_url = data[ 'data' ][ 'cardlistInfo' ] cat_url = next_url.get( 'since_id' , None ) new_url = url + '&since_id=' + str (cat_url) card = data[ 'data' ][ 'cards' ] for card in card: #print(card) mblog = card.get( 'mblog' , None ) if mblog: # 有内容再提取 mid = mblog.get( 'mid' , None ) # id text = mblog.get( 'text' , None ) # 文章标题 source = mblog.get( 'source' , None ) # 发布平台 author_name = mblog.get( 'user' , {}).get( 'screen_name' , None ) # 发布作者 created_at = mblog.get( 'created_at' , None ) #时间 print ([text, source, author_name, mid]) #print(created_at) # 微博下的评论 comments_url = 'https://m.weibo.cn/comments/hotflow?id=' + mid + '&mid=' + mid + '&max_id_type=0' # 爬取每一条数据下面的评论 requests.get(comments_url) comments_response = requests.get(comments_url) comments_data = comments_response.json() #print(comments_data) if comments_data[ 'ok' ] = = 1 : #只读取有评论微博 data_list = comments_data[ 'data' ][ 'data' ] for comment in data_list: comment_text = comment.get( 'text' , None ) comment_mid = comment.get( 'mid' , None ) username = comment[ 'user' ][ 'screen_name' ] print ([comment_mid,username,comment_text]) start(new_url) |
这样我们便可以捕获到全部博主的文章和评论
结果:
完整代码
import requests
import pprint
import time
def start(url):
response = requests.get(url=url)
data = response.json()
#pprint.pprint(data) #将页面内容规范为易懂可视页面
next_url = data['data']['cardlistInfo']
cat_url = next_url.get('since_id',None)
new_url = url + '&since_id=' + str(cat_url)
card = data['data']['cards']
for card in card:
#print(card)
mblog = card.get('mblog', None)
if mblog:
# 有内容再提取
mid = mblog.get('mid', None) # id
text = mblog.get('text', None) # 文章标题
source = mblog.get('source', None) # 发布平台
author_name = mblog.get('user', {}).get('screen_name', None) # 发布作者
created_at = mblog.get('created_at',None) #时间
#try = mblog.get('visible',{}).get('type',None)
#print(try)
print([text, source, author_name, mid])
#print(created_at)
# 微博下的评论
comments_url = 'https://m.weibo.cn/comments/hotflow?id=' + mid + '&mid=' + mid + '&max_id_type=0'
# 爬取每一条数据下面的评论
requests.get(comments_url)
comments_response = requests.get(comments_url)
comments_data = comments_response.json()
#print(comments_data)
if comments_data['ok'] == 1: #只读取有评论微博
data_list = comments_data['data']['data']
for comment in data_list:
comment_text = comment.get('text',None)
comment_mid = comment.get('mid',None)
username = comment['user']['screen_name']
print([comment_mid,username,comment_text])
time.sleep(2)
start(new_url)
if __name__ == '__main__':
url = '捕获的第一个包'
start(url)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?