2

我最近开始使用 Tweepy,尤其是 api.user_timeline。我的脚本从用户那里下载了一系列推文,并将 Tweepy 状态调用中​​可用的各种详细信息的大部分打印到文本文件中。我的问题是从 twitter 中反转微小的 url。我在这个网站上的一个答案中读到,解决它的正确方法是在 Twitter 实体中使用“expanded_url”命令,这就是我所做的。这是我的代码:

import tweepy
import codecs


auth = tweepy.OAuthHandler("xxx", "xxx")
auth.set_access_token("yyy", "yyy")

with codecs.open("file.txt", encoding='utf-8', mode='w+') as f:
   api = tweepy.API(auth)
   for status in tweepy.Cursor(api.user_timeline, "xxx", include_entities=True).items():
    ...
    # Extracting info from the entities
       for hashtag in status.entities['hashtags']:
           f.write(format(hashtag['text']))


       for url in status.entities['urls']:
           f.write(format(url['expanded_url']))

问题是这些扩展的 url 并不总是我需要的完整 url。例如,一条推文的代码给了我一个结果“ http://goo.gl/sOH17n ”,它仍然隐藏了文章来自的真实网站。我有一段代码,它为我提供了带有 urllib2 的完整 url,但是当我将它们两个放在一起时,我得到一个'HTTPError: HTTP Error 403: Forbidden'。这是我的试用版,它不起作用(它总是与之前的部件集成,所以不通过身份验证不是问题)

import urllib2
for url in status.entities['urls']:
        expanded_url=url['expanded_url']
        fullurl= urllib2.urlopen(expanded_url)
        f.write(format(fullurl.url))

所以,我的问题是,有没有办法在 Tweepy 中找到真正完整的网址?如果没有,为什么与 urllib2 的集成不起作用?如果这个问题看起来微不足道,我深表歉意,但我似乎无法摆脱这个问题,而且 tweepy 的文档很粗略。

提前感谢您的任何回答!

4

2 回答 2

1

该 URL 来自 Google,因此我认为 Tweepy 不会存储如果您单击该链接,Google 会引导您到哪里。您可以使用 httplib 找到它,(因此您可以获得 HEAD,而无需完整获取它将加载的页面):

import httplib
from urlparse import urlparse

url = urlparse('http://goo.gl/sOH17n')    # split URL into components
conn = httplib.HTTPConnection(url.hostname, url.port)
conn.request('HEAD', url.path)            # just look at the headers
rsp = conn.getresponse()
if rsp.status in (301,401):               # resource moved (permanent|temporary)
    print rsp.getheader('location')
else:
    print url
conn.close()

当我运行它时,我得到一个 URL,而不是 403 错误。该错误通常表明您无权查看该页面,所以我猜您提供的 URL 不是您发布的那个。

于 2013-07-28T19:51:14.977 回答
0

感谢 swstephe,我专注于头部请求,以避免打开页面,我发现模块请求工作得很好。

所以这是我找到的解决方案:

   import requests
   for url in status.entities['urls']:
        expanded_url=url['expanded_url']
        r= requests.head(expanded_url)
        if r.status_code in range (200,300):
            f.write(format(r.url))
        elif r.status_code in range (300,400):
            f.write(format(r.headers['location']))
        else:
            f.write(format(r.status_code))

我仍然不明白为什么 urllib2 不起作用。猜猜我将从现在开始使用请求。谢谢您的帮助。真的很感激。

于 2013-08-08T16:25:35.670 回答