Python爬取微博评论时返回认证失败的页面,该怎么解决?
爬取评论的的代码:
def fetch_status_comments_and_total_number(sid):
comments_url = "https://m.weibo.cn/comments/hotflow"
payload = {
'id': sid,
'mid': sid,
'page': 1, # 默认返回第一页,但为了防止意外,显示请求第一页
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
}
try:
raw_response = requests.get(comments_url, params=payload,
headers=headers)
response = raw_response.json()
except Exception:
logger.error("请求评论信息时出错,请求的参数为 {},URL 为{}\n 返回的文本为:\n{}".format(sid,
raw_response.url,
raw_response.text))
return 0, None
if response is None or response['ok'] == 0:
return 0, None
total_number = response['data']['total_number']
comments = make_comments(response['data']['data'])
return total_number, comments
有时候能够成功,有时候访问时就出错,log 记录的异常信息为:
请求评论信息时出错,请求的参数为 4309813452636887,URL 为 https://m.weibo.cn/comments/hotflow?id=4309813452636887&mid=4309813452636887&page=1
返回的文本为:
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<link rel="dns-prefetch" href="https://h5.sinaimg.cn">
<meta id="viewport" name="viewport"
content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0">
<meta name="format-detection" content="telephone=no">
<title>微博-出错了</title>
<style>
html {
font-size: 2rem;
}
@media (max-width: 1024px) {
html {
font-size: 1.25rem;
}
}
@media (max-width: 414px) {
html {
font-size: 1.06rem;
}
}
@media (max-width: 375px) {
html {
font-size: 1rem;
}
}
body {
margin: 0;
padding: 0;
background-color: #f2f2f2;
}
p {
margin: 0;
}
.h5-4box {
padding-top: 6.125rem;
text-align: center;
}
.h5-4img {
display: inline-block;
}
.h5-4img img {
max-width: 100%;
}
.h5-4con {
padding-top: 1.875rem;
font-size: 0.875rem;
line-height: 1.2;
color: #636363;
text-align: center;
}
.btn {
display: inline-block;
border: #e86b0f solid 1px;
margin: 0 0 0 5px;
padding: 0 10px;
line-height: 25px;
font-size: .75rem;
vertical-align: middle;
color: #FFF;
border-radius: 3px;
background-color: #ff8200;
}
</style>
</head>
<body>
<div class=“h5-4box”>
<span class=“h5-4img”>
<img src="//h5.sinaimg.cn/upload/2016/04/11/319/h5-404.png">
</span>
<p class=“h5-4con”>认证失败</p>
<br/>
</div>
</body>
</html>
可能是微博的反爬机制?但不清楚是什么机制,是否有对应的解决办法呢?求指教!
注:在浏览器端访问上面请求的 url 是会正常返回结果的。
Python爬取微博评论时返回认证失败的页面,该怎么解决?
6 回复
是的,反扒机制。。。
话说你记得有个 3g 页面版本的微博吗?
遇到微博认证失败,通常是触发了反爬机制。核心解决思路是模拟真实浏览器的请求头,特别是User-Agent和Cookie。
关键步骤:
- 获取有效Cookie:手动登录微博网页版,从开发者工具(F12 -> 网络)复制请求头中的
Cookie值。 - 设置请求头:在爬虫请求中完整携带该
Cookie及其他常用头部信息。 - 使用Session:保持会话状态,避免重复处理Cookie。
示例代码:
import requests
def fetch_weibo_comments(weibo_id, cookie_str):
"""
爬取指定微博ID的评论(基础示例)。
实际评论接口通常需要构造更复杂的URL和参数。
"""
# 1. 设置请求头,重点是Cookie和User-Agent
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Cookie': cookie_str,
'Referer': f'https://weibo.com/{weibo_id}'
}
# 2. 使用Session保持会话
session = requests.Session()
session.headers.update(headers)
# 3. 示例:构造评论请求URL(实际接口需自行分析)
# 此处为示例URL,真实接口通常为Ajax形式,需要分析网络请求获取
comment_url = f'https://weibo.com/ajax/statuses/buildComments?is_reload=1&id={weibo_id}&...'
try:
response = session.get(comment_url)
response.raise_for_status() # 检查请求是否成功
# 4. 处理响应数据
if response.json().get('ok') == 1:
comments_data = response.json().get('data', [])
for comment in comments_data:
print(comment.get('text', ''))
else:
print("可能仍存在认证问题,检查Cookie是否过期或请求参数。")
except requests.RequestException as e:
print(f"请求失败: {e}")
# 使用示例
if __name__ == '__main__':
# 替换为你的微博ID和手动获取的Cookie字符串
WEIBO_ID = '具体微博ID'
YOUR_COOKIE = '你的Cookie字符串'
fetch_weibo_comments(WEIBO_ID, YOUR_COOKIE)
要点说明:
- Cookie有效期:手动获取的Cookie会过期,需要定期更新。
- 动态接口:微博评论数据通常通过Ajax接口加载,需分析网络请求找到真实数据接口(URL和参数)。
- 频率限制:适当添加
time.sleep()控制请求频率,避免被封IP。
一句话建议: 重点模拟浏览器请求头并保持有效Cookie。
这个限制更少吗?能否提供一下地址呢?
我就是找不到才问你。。。
不知道你们要的是不是这个 https://weibo.cn/2154069591/follow
这个和上面的 m.weibo.cn 应该是一样的

