2

最近、Tweepy、特に api.user_timeline を使い始めました。私のスクリプトは、ユーザーからの一連のツイートをダウンロードし、Tweepy Status 呼び出しで入手できるさまざまな詳細のほとんどをテキスト ファイルに出力します。私の問題は、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 ' となり、記事の元の Web サイトはまだ隠されています。urllib2 を使用して完全な URL を取得するコードのスニペットがありますが、2 つを組み合わせると、 「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 内で本当に完全な URL を見つける方法はありますか? そうでない場合、urllib2 との統合が機能しないのはなぜですか? 質問が些細なことのように思われる場合は申し訳ありませんが、この質問から抜け出す方法が見つからないようで、tweepy のドキュメントは大ざっぱです。

ご回答ありがとうございます。

4

2 に答える 2

1

URL は Google から取得されているため、リンクをクリックした場合に Google が誘導する場所を Tweepy が保存しているとは思えません。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()

実行すると、403 エラーではなく、URL が表示されます。このエラーは通常、そのページを表示する権限がないことを示しているため、指定した URL は投稿したものではないと思います。

于 2013-07-28T19:51:14.977 に答える
0

swstephe のおかげで、ページを開かないように head リクエストに集中したところ、うまく機能するモジュール リクエストを見つけました。

だからここに私が見つけた解決策があります:

   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 に答える