【问题标题】:Tweepy full-archive search, Twitter Advanced Search, and GetOldTweets3 are returning different numbers of TweetsTweepy 完整存档搜索、Twitter 高级搜索和 GetOldTweets3 返回不同数量的推文
【发布时间】:2020-04-17 00:24:33
【问题描述】:

使用带有以下参数的 Tweepy、GetOldTweets3 和 Twitter 高级搜索时:

  • 查询:“事故”
  • 地点:“达拉斯,德克萨斯”
  • 自:“2018/1/1”
  • 直到:“2018/1/2”

每种搜索方法的推文数量都不同。 Tweepy 使用全存档搜索返回 12 条推文。 GetOldTweets3 返回 22 条推文。使用 Twitter 高级搜索会返回 3 条推文。推文数量不同是否有原因?

【问题讨论】:

  • 您假设每个搜索工具都将返回相同的结果。根据我的经验,他们通常不会。
  • @RobertHarvey 这有什么原因吗,如果有,哪种搜索方法会返回最准确的结果?
  • 是的,这是有原因的。每个搜索引擎的编写方式都不同,并且有不同的规则来确定匹配项。如果您想要准确的结果,您需要使用符合 ANSI SQL(一种标准)的 SQL 数据库之类的东西。

标签: python twitter tweepy


【解决方案1】:

Twitter 通过其网站进行搜索的操作符与其 API 不同。

Searching "Accident near:Dallas,TX since:2018-01-01 until:2018-01-02" on Twitter itself,产生 22 条推文。如果您只查看最热门的,则只有 3 个,是的,但您可以通过单击“最新”选项卡查看所有这些。此查询使用的 near 运算符似乎没有在任何地方明确记录,因此不清楚它的工作原理。事实上,位置/地点似乎不再是高级搜索 UI 的一部分。从历史上看,这似乎是通过在指定位置的半径范围内搜索(如果未设置 within 运算符,则默认为 15 英里)来实现的。

我假设您正在使用的当前分支/PR for Tweepy adding API.search_full_archive 使用Twitter's premium search APIs 的完整存档端点。像api.search_full_archive("Environment_Name", "Accident place:Dallas,TX", fromDate=201801010000, toDate=201801020000) 这样的东西实际上会返回 12 条推文。但是,这是使用记录在案的place premium search operator,它具有特定的定义行为:

匹配带有指定位置或 Twitter 位置 ID 标记的推文

这意味着它只会返回专门用该位置标记的推文,而不是包括某个半径内附近的其他位置。奇怪的是,这些结果实际上包括 2 条推文,网站的搜索错过了这些推文,并且似乎没有通过位置搜索返回。这可能是由于Twitter's search policies 造成的,但由于 Twitter 的网站搜索没有记录在案,而且有点像黑匣子,因此很难确定确切原因。

如果您想使用高级搜索 API 为搜索指定一组坐标和半径,您可以使用 point_radius 高级搜索运算符执行此操作。使用 Tweepy 的 API.geo_search method,它使用 Twitter API 的 GET geo/search endpoint,以及对“达拉斯,TX”的查询,返回的 Place object 代表德克萨斯州达拉斯,指定了 [-96.7301749064317, 32.819858499999995] 的质心。无法保证这些是 Twitter 网站搜索使用的坐标,但通过一些测试,使用这些坐标与 point_radius,返回与网站搜索结果匹配的确切结果的半径似乎在 17 到 18 英里之间。在 17.5 英里的半径范围内,普莱诺只有 3 条额外的推文。

GetOldTweets3 不使用 Twitter 的 API,而是直接抓取网站。这不应该被认为是可靠的并且违反Twitter's Terms of Service

明确禁止未经 Twitter 事先同意而抓取服务

如果您想要最准确和最明确的结果,您应该使用 Twitter 的 API。如果您想在不违反 Twitter 的 TOS 的情况下以编程方式检索这些结果,这是唯一有效的方法。按位置搜索的选项可以是通过名称或 Twitter 地点 ID、坐标和半径或边界框专门针对该位置,分别使用 placepoint_radiusbounding_box 高级搜索运算符。请注意,由于某些原因,正如其他 2 条推文所示,某些推文可能只能通过特定位置而不是区域找到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 2018-09-15
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 2013-02-28
    • 2018-09-23
    相关资源
    最近更新 更多