【问题标题】:Sample of filtered twitter api stream过滤后的 twitter api 流示例
【发布时间】:2020-10-01 17:53:14
【问题描述】:

我需要获取经过过滤的 twitter 流样本

我正在使用 tweepy 我检查了 Stream 类的函数以获取样本流并进行过滤

但我不知道应该如何设置课程

应该是

stream.filter(track=['']).sample()
stream.sample().filter(track=[''])

或每一个在一行中或什么

如果您对如何根据关键字过滤器获取示例流有其他想法,请提供帮助

提前致谢

【问题讨论】:

    标签: python tweepy twitter-streaming-api


    【解决方案1】:

    Twitter v2 API 包括随机抽样端点过滤推文端点

    后者允许在查询中指定随机样本百分比 (for example, sample:10 will return a random 10% sample)。

    请注意,v2 API 仍然是新的,目前有 a cap of 500k tweets per month

    作为后者的示例,以下代码(modified version of thissee this doc)将收集带有猫或狗标签的流数据,并将其存储在每 100 条推文的 json 文件中。 (注意:这不包括随机抽样查询。)

    import requests
    import os
    import json
    
    import pandas as pd
    # To set your enviornment variables in your terminal run the following line:
    # export 'BEARER_TOKEN'='<your_bearer_token>'
    
    
    data = []
    counter = 0
    
    def create_headers(bearer_token):
        headers = {"Authorization": "Bearer {}".format(bearer_token)}
        return headers
    
    
    def get_rules(headers, bearer_token):
        response = requests.get(
            "https://api.twitter.com/2/tweets/search/stream/rules", headers=headers
        )
        if response.status_code != 200:
            raise Exception(
                "Cannot get rules (HTTP {}): {}".format(response.status_code, response.text)
            )
        print(json.dumps(response.json()))
        return response.json()
    
    
    def delete_all_rules(headers, bearer_token, rules):
        if rules is None or "data" not in rules:
            return None
    
        ids = list(map(lambda rule: rule["id"], rules["data"]))
        payload = {"delete": {"ids": ids}}
        response = requests.post(
            "https://api.twitter.com/2/tweets/search/stream/rules",
            headers=headers,
            json=payload
        )
        if response.status_code != 200:
            raise Exception(
                "Cannot delete rules (HTTP {}): {}".format(
                    response.status_code, response.text
                )
            )
        print(json.dumps(response.json()))
    
    
    def set_rules(headers, delete, bearer_token):
        # You can adjust the rules if needed
        sample_rules = [
            {"value": "dog has:images", "tag": "dog pictures"},
            {"value": "cat has:images -grumpy", "tag": "cat pictures"},
        ]
        payload = {"add": sample_rules}
        response = requests.post(
            "https://api.twitter.com/2/tweets/search/stream/rules",
            headers=headers,
            json=payload,
        )
        if response.status_code != 201:
            raise Exception(
                "Cannot add rules (HTTP {}): {}".format(response.status_code, response.text)
            )
        print(json.dumps(response.json()))
    
    
    def get_stream(headers, set, bearer_token):
        global data, counter
        response = requests.get(
            "https://api.twitter.com/2/tweets/search/stream", headers=headers, stream=True,
        )
        print(response.status_code)
        if response.status_code != 200:
            raise Exception(
                "Cannot get stream (HTTP {}): {}".format(
                    response.status_code, response.text
                )
            )
        for response_line in response.iter_lines():
            if response_line:
                json_response = json.loads(response_line)
                print(json.dumps(json_response, indent=4, sort_keys=True))
                data.append(json_response['data'])
                if len(data) % 100 == 0:
                    print('storing data')
                    pd.read_json(json.dumps(data), orient='records').to_json(f'tw_example_{counter}.json', orient='records')
                    data = []
                    counter +=1
    
    
    
    def main():
    
        bearer_token = os.environ.get("BEARER_TOKEN")
        headers = create_headers(bearer_token)
        rules = get_rules(headers, bearer_token)
        delete = delete_all_rules(headers, bearer_token, rules)
        set = set_rules(headers, delete, bearer_token)
        get_stream(headers, set, bearer_token)
    
    
    
    if __name__ == "__main__":
        main()
    
    
    

    然后,将 pandas 数据框中的数据加载为 df = pd.read_json('tw_example.json', orient='records').

    【讨论】:

    • 谢谢,但这里仍在过滤主要的完整流 api 我想获得一个带有 api 的示例流,但是该流是根据关键字过滤的 我看到这里我确定了推文的数量基于计数器,所以我创建了自己的采样代码,但该示例提供了 1% 的流并声称变化很大
    • @mohsen.21 你是对的。 V2 API 再次独立于采样流和过滤流,而不是两个功能一起使用(我编辑了上面的答案)。如果您使用过滤 API,您可以编写代码以采样大约 1-2% 的时间(例如,每小时随机选择 1 分钟间隔)。如果您使用的是采样 API,您可以编写代码来过滤推文并存储相关数据。
    【解决方案2】:

    我建议阅读 tweepy 的 api 文档。 Here你可以看到如何过滤你想要的流。

    通过阅读其他代码 sn-ps,我相信应该这样做:

    stream.filter(track=['Keyword'])
    print(stream.sample())
    

    【讨论】:

    • 似乎是一种有效的方法,遗憾的是关于 tweepy 的文档没有提到这一点,甚至没有提到示例流会让你知道它是如何进行的
    • 是的,我也找不到。祝你好运!
    【解决方案3】:

    据我了解,tweepy 使用 twitter v1.1 API,它具有用于实时采样和过滤推文的单独 API。

    Twitter API 参考。 v1 sample-realtime v1 filter-realtime

    方法一:可以使用stream.filter(track=['Keyword1', 'keyord2'])等获取过滤后的流数据,然后从收集的数据中采样记录。

    class StreamListener(tweepy.StreamListener):
        def on_status(self, status):
            # do data processing and storing here
    
    

    参见https://www.storybench.org/how-to-collect-tweets-from-the-twitter-streaming-api-using-python/Ignoring Retweets When Streaming Twitter Tweets等示例

    方法 2:可以编写以随机时间间隔启动和停止流式传输的程序(例如,每 15 分钟随机采样 3 分钟间隔)。

    方法3:可以改为使用采样API收集数据,然后用关键字过滤以存储相关数据。

    【讨论】:

    • @mohsen.21 所以,后来我确实找到了一种通过 Twitter v2 API 过滤和采样流的方法。在过滤流中,也可以添加“sample:10”来获得过滤流的10%样本。
    • 真的,在设置流媒体的类时或启动过滤后的流之后应该添加它真的很棒? api 2 也可以与 tweepy 一起使用吗?
    • @mohsen.21 这是 Twitter v2 API,仍处于早期访问阶段,Tweepy 未使用。我在另一个答案中发布的脚本中提供了如何使用 Twitter V2 API 的示例。如果要进行采样,可以添加“sample:10”等查询条件。因为 V2 API Filtered Streaming 每月有 500k 条推文上限(而 V1.1 API Filtered Streaming 似乎没有这样的上限), Twitter 的文档实际上建议添加一个采样条件,例如“sample:10”。
    猜你喜欢
    • 1970-01-01
    • 2011-05-13
    • 2014-08-09
    • 2020-08-26
    • 2022-06-30
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 2018-07-10
    相关资源
    最近更新 更多