按推文位置和用户位置抓取推文

12

我正在尝试使用tweepy通过tweets的位置而不是用户位置来下载tweets。目前,我可以下载包含用户位置信息的tweets,但即使geo_enabled返回True,也无法获取tweet位置。

例如,假设user_a来自纽约,但他在加利福尼亚州发推文。我想获得用户位置(纽约)和tweet位置(加利福尼亚州)。

代码:

import tweepy
from tweepy import Stream
from tweepy import OAuthHandler
from tweepy.streaming import StreamListener
import pandas as pd
import json
import csv
import sys
reload(sys)
sys.setdefaultencoding('utf8')

ckey = 'key'
csecret = 'secret'
atoken = 'token'
asecret = 'secret'
#csvfile = open('StreamSearch.csv','a')
#csvwriter = csv.writer(csvfile, delimiter = ',')

class StdOutListener(StreamListener):
    def __init__(self, api=None):
        super(StdOutListener, self).__init__()
        self.num_tweets = 0

    def on_data(self, data):
        self.num_tweets += 1
        if self.num_tweets < 5: #Remove the limit of no. of tweets to 5
            print data
            return True
        else:
            return False

    def on_error(self, status):
        print status


l = StdOutListener()
auth = OAuthHandler(ckey, csecret)
auth.set_access_token(atoken, asecret)
stream = Stream(auth, l)
stream.filter(locations = [80.10,12.90,80.33,13.24] ) #user location 

输出

userLocation, userTimezone, Coordinates,GeoEnabled, Language, TweetPlace
London,UK      Amsterdam                  FALSE      en         null
Aachen,Germany  Berlin                    TRUE       de         null
Kewaunee Wi                               TRUE       en         null
Connecticut, Eastern Time (US & Canada)   TRUE       en         null
                                          TRUE       en         null
Lahore, City of Gardens London            TRUE       en         null
NAU class of 2018.  Arizona               FALSE      en         null
                                          FALSE      en         null
    Pacific Time (US & Canada)            FALSE      en         null

上述输出是海量数据的清理版本。尽管启用了Geolocation,但我无法获取推文位置或坐标


这是一个非常广泛的问题,请告诉我们你已经尝试了什么。 - SIslam
@SIslam 包含了代码和输出结果。 - Sitz Blogz
1
可能相关- https://dev59.com/YXLYa4cB1Zd3GeqPbszd#16892093 - Gaurav Vichare
@SitzBlogz,下面的答案是否符合您的要求?如果不是,请告诉我们您还需要什么。 - ilyas patanam
@imp9 感谢您的回答。我想在这里讨论的主要问题是,我知道用户可能会限制共享他的位置信息。但我更感兴趣的是推文的位置信息。即使启用了地理位置功能,我仍然看到相同的模式。我知道用户也需要明确授权,但对于转发推文,我有点困惑。 - Sitz Blogz
@SitzBlogz 要显示推文位置,需要进行两个步骤。1.必须打开geo_enabled选项。2.用户必须授权。如果用户不授权,则推文位置将不会显示。转推也是同样的方式。如果坐标/地点显示为空或空白,则表示用户没有授权。这样清楚了吗,还是我漏掉了你提出问题的部分? - ilyas patanam
1个回答

10
  1. 为什么geo_enabled == True的推文没有提供推文的位置信息?

根据这里的说明,如果place或coordinates为空,这意味着用户没有允许该推文显示位置信息。打开geo_enabled功能的用户仍然需要明确授权才能显示其精确位置。此外,在文档中还指出:

geo_enabled:当为true时,表示用户已启用地理标记他们的Tweet的可能性。对于当前用户在使用POST statuses / update时附加地理数据,必须为此字段设置为true。

  1. 如何通过推文位置进行过滤?点击这里

如果通过位置进行筛选,则只会包括位于请求边界框内的推文,用户位置字段不用于筛选推文。如果coordinates和place为空,则推文将无法通过筛选。

#filter all tweets from san francisco
myStream.filter(location= [-122.75,36.8,-121.75,37.8])
  1. 如何按用户位置和推文位置进行过滤?

您可以捕获过滤器中的推文,然后检查作者的位置,以匹配您感兴趣的地区。

class StdOutListener(StreamListener):
    def __init__(self, api=None):
        super(StdOutListener, self).__init__()
        self.num_tweets = 0

    def on_data(self, data):
    #first check the location is not None
        if status.author.location and 'New York' in status.author.location:
            self.num_tweets += 1
            print data
        if self.num_tweets < 5: #Remove the limit of no. of tweets to 5            
            return True
        else:
            return False
    def on_error(self, status):
        print status
  1. 如何不仅仅限制于Twitter API的过滤器?

请记住,该过滤器只要符合其中一个参数,就允许所有推文,因此如果您需要更严格的限制,请在def on_data(self, data)中包含条件子句,就像我在(3)中对作者位置所做的那样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接