【问题标题】:urlib & requests fail "sometimes" to get the final URLurllib 或请求“有时”无法获取最终 URL
【发布时间】:2013-04-05 11:24:54
【问题描述】:

为了概述问题,我有一个 Twitter 用户“screen_names”列表,我想验证他们是否是被暂停的用户。我不想使用 twitter 搜索 API 来避免速率限制问题(列表很大)。因此,我正在尝试使用一组计算机来标记我的数据集(无论我的数据库中的帐户是否被暂停)。

如果某个帐户被 Twitter 暂停,并且您尝试通过链接 http://www.twitter/screen_name 访问它们,您将被重定向到 https://twitter.com/account/suspended

我尝试使用带有urlib 的python 2.7 和geturl() 方法来捕获这种行为。它有效但不可靠(我在同一个链接上没有得到相同的结果)。我在同一个帐户上对其进行了测试,但有时它会返回https://twitter.com/account/suspended,有时它会返回http://www.twitter/screen_name

请求也会出现同样的问题。

我的代码:

import requests
from lxml import html
screen_name = 'IaMaGuyGetIt'
account_url = "https://twitter.com/"+screen_name
url = requests.get(account_url)
print url.url
req = urllib.urlopen(url.url).read()
page = html.fromstring(req)
for heading in page.xpath("//h1"):
    if heading.text == 'Account suspended':
        print True

【问题讨论】:

  • 如果它有时可以工作,而在其他时候却不行代码,这里有问题。
  • 可以通过url.history查看请求是否被重定向,也可以查看url.url是否依旧。
  • 推特服务器只重定向到一次;它可能已键入您的 IP 地址。在该重定向之后,Twitter 依靠您的浏览器缓存了重定向。

标签: python twitter python-2.7 python-requests


【解决方案1】:

twitter 服务器只为你提供一次 302 重定向;之后它会假设您的浏览器已经缓存了重定向。

页面的body确实包含一个指针,所以即使你没有被重定向,你也可以看到那里仍然有链接:

r = requests.get(account_url)
>>> r.url
u'https://twitter.com/IaMaGuyGetIt'
>>> r.text
u'<html><body>You are being <a href="https://twitter.com/account/suspended">redirected</a>.</body></html>'

查找确切的文本。

【讨论】:

    猜你喜欢
    • 2021-08-29
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多