如何在Python获取的JSON对象中提取Twitter关注列表数据?
解决Twitter关注列表爬取的解析问题
嘿,我看到你在爬取Twitter用户关注列表时遇到了解析问题,咱们一步步来搞定它!
一、修正当前的解析错误
你现在的问题出在把整个JSON对象转成字符串后直接解析,但实际上需要先提取JSON里的items_html字段——这个字段才包含你要的HTML内容。调整后的代码应该是这样:
import requests import json from bs4 import BeautifulSoup s = requests.session() # 先完成登录请求(确保你的payload和headers配置正确) res = s.post("https://twitter.com/sessions", data=payload, headers=headers) print(res.status_code) # 建议先确认登录是否成功,200不一定代表登录有效,可检查响应内容 # 请求关注列表的动态接口 r = s.get("https://twitter.com/akhiltaker619/following/users?include_available_features=1&include_entities=1&max_position=1590310744326457266&reset_error_state=false") dp = r.text dp1 = json.loads(dp) # 关键步骤:提取items_html字段中的HTML内容 if 'items_html' in dp1: item_html = dp1['items_html'] soup = BeautifulSoup(item_html, "html.parser") x1 = soup.find_all("b", {"class": "u-linkComplex-target"}) for i in x1: print(i.text.strip()) # 用strip()去除文本前后的多余空格 else: print("未找到items_html字段,可能登录失败或接口返回格式已变更")
之前的代码错误在于:你把整个JSON对象转成字符串x = json.dumps(dp1),这会把结构化的JSON变成纯文本,BeautifulSoup自然找不到对应的HTML标签。正确逻辑是直接取出JSON中存储HTML片段的字段,再用BeautifulSoup解析这个字段的内容。
二、无需JSON获取动态内容的方法
其实这个Twitter动态加载接口本身就返回JSON格式响应,所以必须解析JSON才能拿到HTML片段。不过如果你不想处理JSON,可以用模拟浏览器的工具(比如Selenium),它会帮你完整加载页面(包括动态渲染内容),直接从页面DOM中提取元素:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化Chrome浏览器(需下载对应版本的chromedriver) driver = webdriver.Chrome() driver.get("https://twitter.com/akhiltaker619/following") # 等待页面加载完成(等待目标元素出现) wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.CLASS_NAME, "u-linkComplex-target"))) # 提取所有关注用户的名称 user_names = driver.find_elements(By.CLASS_NAME, "u-linkComplex-target") for name in user_names: print(name.text.strip()) # 关闭浏览器 driver.quit()
这种方法的优点是不用手动处理接口请求和JSON解析,完全模拟用户浏览流程;缺点是速度比直接用requests慢,且需要配置浏览器驱动。另外要注意:Twitter有严格的反爬机制,频繁请求可能被限制,无论用哪种方法都要控制请求频率,必要时使用代理。
内容的提问来源于stack exchange,提问作者Akhil Reddy
相关产品推荐
相关产品推荐

