更新部分爬虫以兼容本地运行及数据库存储
This commit is contained in:
@@ -58,11 +58,47 @@ class WeiboClient:
|
||||
if enable_return_response:
|
||||
return response
|
||||
|
||||
data: Dict = response.json()
|
||||
# 检查响应状态码
|
||||
if response.status_code != 200:
|
||||
error_msg = f"HTTP {response.status_code}: {response.text[:200]}"
|
||||
utils.logger.error(f"[WeiboClient.request] request {method}:{url} failed with status {response.status_code}")
|
||||
raise DataFetchError(error_msg)
|
||||
|
||||
# 检查响应内容类型
|
||||
content_type = response.headers.get("content-type", "").lower()
|
||||
if "application/json" not in content_type and "text/json" not in content_type:
|
||||
# 可能是HTML响应(如登录页面)
|
||||
response_text = response.text[:500]
|
||||
utils.logger.warning(f"[WeiboClient.request] Unexpected content type: {content_type}, response preview: {response_text}")
|
||||
# 如果看起来像是HTML,可能是需要登录
|
||||
if "<html" in response_text.lower() or "<!doctype" in response_text.lower():
|
||||
raise DataFetchError("Response is HTML, may need to login or cookie expired")
|
||||
raise DataFetchError(f"Unexpected content type: {content_type}")
|
||||
|
||||
# 安全地解析JSON
|
||||
try:
|
||||
data: Dict = response.json()
|
||||
except ValueError as e:
|
||||
# JSON解析失败
|
||||
response_text = response.text[:500]
|
||||
utils.logger.error(f"[WeiboClient.request] JSON decode error for {method}:{url}")
|
||||
utils.logger.error(f"[WeiboClient.request] Response text (first 500 chars): {response_text}")
|
||||
raise DataFetchError(f"Failed to parse JSON response: {e}")
|
||||
|
||||
# 检查响应是否为空
|
||||
if not data:
|
||||
utils.logger.warning(f"[WeiboClient.request] Empty response for {method}:{url}")
|
||||
return {"cards": []}
|
||||
|
||||
ok_code = data.get("ok")
|
||||
if ok_code == 0: # response error
|
||||
msg = data.get("msg", "response error")
|
||||
# "这里还没有内容" 是正常情况,表示没有更多数据,不应该抛出异常
|
||||
if msg == "这里还没有内容" or "还没有内容" in msg:
|
||||
utils.logger.info(f"[WeiboClient.request] No more content available: {msg}")
|
||||
return {"cards": []} # 返回空结果,而不是抛出异常
|
||||
utils.logger.error(f"[WeiboClient.request] request {method}:{url} err, res:{data}")
|
||||
raise DataFetchError(data.get("msg", "response error"))
|
||||
raise DataFetchError(msg)
|
||||
elif ok_code != 1: # unknown error
|
||||
utils.logger.error(f"[WeiboClient.request] request {method}:{url} err, res:{data}")
|
||||
raise DataFetchError(data.get("msg", "unknown error"))
|
||||
|
||||
Reference in New Issue
Block a user