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

Posted

技术标签:

【中文标题】按推文位置和用户位置抓取推文【英文标题】:Scrape tweets by tweet location and user location 【发布时间】:2016-03-07 19:30:42 【问题描述】:

我正在尝试使用 tweepy 使用推文位置而不是用户位置来下载推文。目前,我可以下载带有用户位置的推文,但即使geo_enabled 返回 True,我也无法获取推文位置。

例如,假设 user_a 来自纽约,但他的推文来自加利福尼亚。我想要用户位置(纽约)和推文位置(加利福尼亚)。

代码:

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,我也无法获取推文位置,也无法获取co-ordinates

【问题讨论】:

这个非常广泛的问题,让我们知道您尝试了什么。 @SIslam 包含代码和输出 可能相关-***.com/a/16892093/4065350 @SitzBlogz 下面的答案是您想要的吗?如果没有,请告诉我们您还在寻找什么。 @imp9 谢谢你的回答。我想在这里讨论的要点是我理解用户可能会限制分享他的位置。我对推文位置更感兴趣。即使启用了 geo_location。理解用户也需要给予明确的许可。但我也看到了相同的转发模式。在这种情况下我有点困惑。 【参考方案1】:
    为什么带有geo_enabled == True 的推文不提供推文位置?

根据this,如果地点或坐标为无,则表示用户不允许该推文的权限。启用 geo_enabled 的用户仍然必须明确许可才能显示其确切位置。此外,documentation 声明:

geo_enabled:当为真时,表示用户已启用 可能对他们的推文进行地理标记。该字段必须为真,当前用户在使用 POST 状态/更新时附加地理数据。

    如何按推文位置过滤? Check here

如果您按位置过滤,则只会包含位于请求边界框内的推文,用户的位置字段不用于过滤推文。如果坐标和地点为空,则推文不会通过过滤器。

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

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

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
    如何不局限于 Twitter API 过滤器?

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

【讨论】:

以上是关于按推文位置和用户位置抓取推文的主要内容,如果未能解决你的问题,请参考以下文章

如何确定推文的位置(坐标)

使用 MGTwitterEngine 发布的推文会丢失位置坐标?

按位置过滤推文

Twitter - 查询特定地理位置半径内的推文

如何获取 Twitter 上发布的签到推文的地理位置和地点 ID

使用twitteR推文的地理位置似乎不准确