使用Python的snscrape爬取Twitter报错,求技术解决方案
解决snscrape爬取Twitter时的non-200状态码报错
你遇到的报错是Twitter反爬机制拦截了无授权的频繁请求导致的,以下是可行的解决步骤:
降低请求频率,添加延迟
在循环中每次获取推文后加入短暂延迟,避免触发Twitter的频率限制。修改后的代码如下:import time pd.options.display.max_colwidth = 500 query = "(music) lang:en since:2023-01-01 until:2023-02-02" tweets = [] limit = 10 get_ipython().run_line_magic('time', '') try: print("start scraping") for tweet in sntwitter.TwitterSearchScraper(query=query, top=True).get_items(): if len(tweets) == limit: break tweets.append([tweet.date, tweet.user.username, tweet.content]) time.sleep(1) # 每次请求后延迟1秒 df = pd.DataFrame(tweets, columns=['datetime', 'username', 'content']) except Exception as e: print(e) print("Finished") print("-------")更新snscrape到最新版本
旧版本可能存在与Twitter接口不兼容的问题,执行命令更新:pip install --upgrade snscrape设置自定义请求头(User-Agent)
模拟浏览器请求,避免被识别为爬虫:import snscrape.modules.twitter as sntwitter # 替换为常见浏览器的User-Agent sntwitter.TwitterSearchScraper._getHeaders = lambda self: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } # 后续爬取代码保持不变检查查询语句一致性
注意到报错信息中的查询是(Gempa) lang:id,但你的代码中是(music) lang:en,可能是缓存残留或旧请求影响,确保当前运行的代码与查询语句完全匹配。
如果以上方法仍无效,建议使用Twitter官方API(需申请开发者账号),这是最稳定的爬取方式,不会受到反爬限制。
内容的提问来源于stack exchange,提问作者Joko Ade Nursiyono
相关产品推荐
相关产品推荐

