Tweepy技术问题:如何采集同时包含两个搜索词列表中至少各一个词汇的推文
解决Tweepy多词汇搜索的问题(单列表失效 + 双列表AND逻辑)
首先,咱们先解决你单个词汇列表搜索失效的问题,然后再实现你需要的双主题词汇的AND搜索逻辑。
问题1:单个列表多词汇时搜索无结果
你之前的代码是把Excel读取后的数组转成字符串再做一堆替换,这种方式很容易因为格式混乱(比如多余的括号、引号、换行符)导致Twitter搜索API无法正确解析你的query,尤其是词汇数量增多时,格式错误会更明显。
替换方案是直接从Pandas的Series生成干净的OR连接字符串,不用那些容易出错的replace操作:
# 读取爱情词汇Excel并处理 file_loc1 = "search_words/love.xlsx" love_df = pd.read_excel(file_loc1, index_col=None, na_values=['NA'], usecols="A", skiprows=11) # 清理空值、转小写、转成列表 love_words = love_df['love'].dropna().str.lower().tolist() # 生成OR连接的搜索字符串,格式:word1 OR word2 OR word3 love_search_str = " OR ".join(love_words) # 加上去重推过滤,单个列表的搜索query就完成了 single_list_query = f"{love_search_str} -filter:retweets"
这种方式生成的query完全符合Twitter搜索语法,不会有多余的符号,词汇再多也能正常识别。
问题2:实现双列表的AND搜索逻辑
要实现(爱情词1 OR 爱情词2...) AND (健康词1 OR 健康词2...)的逻辑,只需要把两个列表的OR字符串分别用括号包裹,再用AND连接即可,完整代码示例:
import pandas as pd import tweepy as tw # --- 处理爱情词汇列表 --- file_loc1 = "search_words/love.xlsx" love_df = pd.read_excel(file_loc1, index_col=None, na_values=['NA'], usecols="A", skiprows=11) love_words = love_df['love'].dropna().str.lower().tolist() love_search_str = " OR ".join(love_words) # --- 处理健康词汇列表 --- file_loc2 = "search_words/health.xlsx" health_df = pd.read_excel(file_loc2, index_col=None, na_values=['NA'], usecols="A", skiprows=11) health_words = health_df['health'].dropna().str.lower().tolist() health_search_str = " OR ".join(health_words) # --- 构建最终搜索query --- # 用括号分组两个主题的OR逻辑,再用AND连接,加上去重推过滤 final_query = f"({love_search_str}) AND ({health_search_str}) -filter:retweets" date_since = "2020-01-01" # --- 采集推文 --- tweets = tw.Cursor(api.search, q=final_query, lang="en", since=date_since).items(5000) tweet_text = [tweet.text for tweet in tweets]
额外注意事项
- Query长度限制:Twitter的搜索query最大长度是512字符,如果你的词汇列表太长,导致最终query超过这个限制,API会返回错误。这时候需要精简词汇,或者分批次拆分词汇列表进行搜索。
- 空值处理:一定要用
dropna()过滤Excel里的空行,避免空字符串被加入搜索词,破坏语法。 - 列名匹配:确保Excel里的列名和代码中引用的一致(比如
love_df['love']对应Excel里的列名是love),如果列名不对要调整代码里的字段名。
内容的提问来源于stack exchange,提问作者zombysis
相关产品推荐
相关产品推荐

