如何使用Tweepy创建一个pandas数据框?

Rei*_*ves 4 python twitter list tweepy

在Python 3中,我制作程序以在Twitter中提取帖子和喜欢:

import tweepy
import pandas as pd

consumer_key = ''
consumer_secret = ''
access_token = ''
access_token_secret = ''
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)
Run Code Online (Sandbox Code Playgroud)

此函数接收配置文件的教学分类(仅适用于数据库组织)和配置文件的名称.它创建一个包含字典的列表,然后返回:

def linhadotempo(posicao, valor):
    tela = api.user_timeline(valor) 
    bolha = []
    for status in tela:
        dicionario = {"nome": valor, "posicionamento": posicao, "posts_links": status.text, "curtidas": status.favorite_count}
        bolha.append(dicionario)
    return bolha
Run Code Online (Sandbox Code Playgroud)

Twitter个人资料的名称列表及其教学评级.然后转换成数据帧:

data = {
'nome': ['jeanwyllys_real', 'lucianagenro', 'jairbolsonaro', 'MBLivre'],
'posicionamento': ['esquerda', 'esquerda', 'direita', 'direita']
        }
perfis = pd.DataFrame(data, columns=['nome','posicionamento'])
perfis.reset_index()
    index   nome    posicionamento
0   0   jeanwyllys_real     esquerda
1   1   lucianagenro    esquerda
2   2   jairbolsonaro   direita
3   3   MBLivre     direita
Run Code Online (Sandbox Code Playgroud)

我创建了一个最终列表,将函数中创建的列表放在一起.我在配置文件的数据框中进行迭代以激活该功能

bolhas = []
for num, row in perfis.iterrows():
    bolha = linhadotempo(row['posicionamento'], row['nome'])
    bolhas.append(bolha)
Run Code Online (Sandbox Code Playgroud)

我的意图是用这个创建一个最终的数据帧,但它没有成功.我的意图是列"curtidas","nome","posicionamento"和"posts_links"

bolhas_final = pd.DataFrame(bolhas)
bolhas_final.reset_index()
index   0   1   2   3   4   5   6   7   8   ...     10  11  12  13  14  15  16  17  18  19
0   0   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   ...     {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...
1   1   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   ...     {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...
2   2   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   ...     {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...
3   3   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   ...     {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...
Run Code Online (Sandbox Code Playgroud)

通过显示"bolhas"的内容,我相信错误是append在列表中创建了几个列表:

[[{'curtidas': 122,
   'nome': 'jeanwyllys_real',
   'posicionamento': 'esquerda',
   'posts_links': 'A expressão "ideologia de gênero" é uma farsa criada para combater a promoção da igualdade e perpetrar a violência… https:///lWdLANLzc5'},
  {'curtidas': 316,
   'nome': 'jeanwyllys_real',
   'posicionamento': 'esquerda',
   'posts_links': 'O termo fantasioso "ideologia de gênero" foi criado por aqueles que falam em "ditadura gay". Quando o ministro ileg… https:///zv2aY31X9p'},
...
 [{'curtidas': 378,
   'nome': 'lucianagenro',
   'posicionamento': 'esquerda',
   'posts_links': 'Que coisa mais ridícula o ministro da Educação falando em rede nacional que a nova base curricular "está sendo entr… https:///h6l95GhdWT'},
...
{'curtidas': 500,
   'nome': 'MBLivre',
   'posicionamento': 'direita',
   'posts_links': 'URGENTE: Lula pede 1 milhão de reais em indenização moral a Dallagnol e Justiça nega https://d9vVwRH2IS via @'}]]
Run Code Online (Sandbox Code Playgroud)

有没有正确的方法将创建的列表合并为一个?我想在创建数据帧时保留此结构.

wor*_*ise 8

这是一个简单的方法:

import os
import tweepy
import pandas as pd

# use os.environ.get to obtain other environment variables
# from ~/.bashrc or ~/.zshrc etc., so they aren't in your code
consumer_key = os.environ.get('c_key')
consumer_secret = # os...
access_token = # os...
access_token_secret = # os...
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)

results = api.search(q='cheese', count=100)

json_data = [r._json for r in results]

df = pd.json_normalize(json_data)
Run Code Online (Sandbox Code Playgroud)

  • 2021 年 5 月(Py 3.9):弃用警告。将 {df = pd.io.json.json_normalize(json_data)} 替换为 {df = pd.json_normalize(json_data)} (2认同)

Nik*_*ris 5

导入我们将要使用的所需库:

import pandas as pd
import numpy as np
import tweepy
import json
Run Code Online (Sandbox Code Playgroud)

提供连接Twitter API的密钥:

consumer_key = '....'
consumer_secret = '....'
access_token = '....'
access_secret = '....'
Run Code Online (Sandbox Code Playgroud)

下一步是创建OAuthHandler实例......

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
Run Code Online (Sandbox Code Playgroud)

...然后获得对Twitter API的访问权限.

auth.set_access_token(access_token, access_secret)
Run Code Online (Sandbox Code Playgroud)

最后,我们创建了一个API对象,我们将使用它来获取推文:

api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True)
Run Code Online (Sandbox Code Playgroud)

从FC Barcelona twitter账户中获取最近20条推文:

last_20_tweets_of_FC_Barcelona = api.user_timeline('FCBarcelona')

然后在这个代码块中我们隔离了我们下载的每个tweepy状态对象的json部分,并将它们全部添加到列表中....

my_list_of_dicts = []
for each_json_tweet in last_20_tweets_of_FC_Barcelona:
    my_list_of_dicts.append(each_json_tweet._json)
Run Code Online (Sandbox Code Playgroud)

...然后我们将此列表写入txt文件:

with open('tweet_json_Barca.txt', 'w') as file:
        file.write(json.dumps(my_list_of_dicts, indent=4))
Run Code Online (Sandbox Code Playgroud)

现在我们将从tweet_json.txt文件创建一个DataFrame:

my_demo_list = []
with open('tweet_json_Barca.txt', encoding='utf-8') as json_file:  
    all_data = json.load(json_file)
    for each_dictionary in all_data:
        tweet_id = each_dictionary['id']
        text = each_dictionary['text']
        favorite_count = each_dictionary['favorite_count']
        retweet_count = each_dictionary['retweet_count']
        created_at = each_dictionary['created_at']
        my_demo_list.append({'tweet_id': str(tweet_id),
                             'text': str(text),
                             'favorite_count': int(favorite_count),
                             'retweet_count': int(retweet_count),
                             'created_at': created_at,
                            })
        #print(my_demo_list)
        tweet_json = pd.DataFrame(my_demo_list, columns = 
                                  ['tweet_id', 'text', 
                                   'favorite_count', 'retweet_count', 
                                   'created_at'])
Run Code Online (Sandbox Code Playgroud)