请求修复获取指定用户最新Twitter推文链接的报错代码
解决Twitter用户最新推文链接爬取中的AttributeError问题
问题根源
你遇到的AttributeError: 'NoneType' object has no attribute 'find',本质是代码里的soup.find("div", class_="tweet")返回了None——也就是BeautifulSoup在页面里找不到你指定的元素,后续调用last_tweet.find()自然会报错。具体原因有三个:
- 动态内容渲染:Twitter现在用客户端JS渲染页面,
requests.get只能拿到空的页面框架,实际推文内容是加载页面后才生成的,静态HTML里根本没有目标元素。 - 页面结构更新:Twitter的页面类名已经迭代多次,旧的
tweet、tweet-link这类选择器早就失效了。 - 反爬拦截:未登录状态下直接请求用户主页,大概率会被重定向到登录验证页面,返回的HTML里完全没有推文内容。
修复方案
方案1:用Selenium处理动态页面
Selenium可以模拟浏览器加载页面,等JS渲染完成后再解析内容,能解决动态页面的问题:
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 def get_last_tweet_link(username): url = f"https://twitter.com/{username}" # 这里用Chrome浏览器,需要提前安装对应版本的ChromeDriver并配置环境变量 driver = webdriver.Chrome() driver.get(url) try: # 等待最新推文加载完成,用Twitter当前的推文标识元素定位 tweet_link = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, '//article[@data-testid="tweet"]//time/parent::a')) ) return tweet_link.get_attribute("href") finally: driver.quit() if __name__ == "__main__": link = get_last_tweet_link("elonmusk") print(link)
方案2:用Twitter官方API(推荐)
静态爬取容易被封,官方API更稳定合规,需要先申请Twitter开发者账号获取密钥:
import tweepy def get_last_tweet_link(username): # 替换为你自己的API密钥信息 API_KEY = "你的API_KEY" API_SECRET = "你的API_SECRET" ACCESS_TOKEN = "你的ACCESS_TOKEN" ACCESS_TOKEN_SECRET = "你的ACCESS_TOKEN_SECRET" auth = tweepy.OAuthHandler(API_KEY, API_SECRET) auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET) api = tweepy.API(auth) # 获取用户最新1条推文 latest_tweets = api.user_timeline(screen_name=username, count=1) if latest_tweets: return f"https://twitter.com/{username}/status/{latest_tweets[0].id_str}" return None if __name__ == "__main__": link = get_last_tweet_link("elonmusk") print(link)
注意事项
- 使用Selenium时,要保证浏览器驱动和浏览器版本匹配,避免启动失败。
- 官方API有请求频率限制,需遵守Twitter的开发者规范,不要过度请求。
- 不管用哪种方式,都不要频繁发起请求,防止触发反爬机制导致IP被封禁。
内容的提问来源于stack exchange,提问作者Foad
相关产品推荐
相关产品推荐

