2

Scrapy を使用して、iTunes の AppStore データベースからデータを取得しています。このアプリのリストから始めます: http://itunes.apple.com/us/genre/mobile-software-applications/id36?mt=8

次のコードでは、米国ストアのすべてのアプリを対象とする最も単純な正規表現を使用しています。

from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule

class AppStoreSpider(CrawlSpider):
    domain_name = 'itunes.apple.com'
    start_urls = ['http://itunes.apple.com/us/genre/mobile-software-applications/id6015?mt=8']

    rules = (
        Rule(SgmlLinkExtractor(allow='itunes\.apple\.com/us/app'),
            'parse_app', follow=True,
        ),
    )

def parse_app(self, response):
    ....

SPIDER = AppStoreSpider()

実行すると、次のメッセージが表示されます。

 [itunes.apple.com] DEBUG: Crawled (200) <GET http://itunes.apple.com/us/genre/mobile-software-applications/id6015?mt=8> (referer: None)
 [itunes.apple.com] DEBUG: Filtered offsite request to 'itunes.apple.com': <GET http://itunes.apple.com/us/app/bloomberg/id281941097?mt=8>

ご覧のとおり、最初のページのクロールを開始すると、「「itunes.apple.com」へのオフサイト リクエストをフィルタリングしました」と表示されます。その後、スパイダーは停止します..次のメッセージも返します。

[ScrapyHTTPPageGetter,client] /usr/lib/python2.5/cookielib.py:1577: exceptions.UserWarning: cookielib bug!

トレースバック (最後の最後の呼び出し): ファイル "/usr/lib/python2.5/cookielib.py"、1575 行目、make_cookies parse_ns_headers(ns_hdrs) 内、要求) ファイル "/usr/lib/python2.5/cookielib.py "、1532 行目、_cookies_from_attrs_set cookie = self._cookie_from_cookie_tuple(tup, request) ファイル "/usr/lib/python2.5/cookielib.py"、1451 行目、_cookie_from_cookie_tuple の場合、バージョンが None でない場合: version = int(version) ValueError: 基数 10 の int() の無効なリテラル: '"1"'

他の Web サイトでも同じスクリプトを使用しましたが、この問題は発生しませんでした。

なにか提案を? 

4

2 に答える 2

1

この投稿はかなり古いようです。まだ原因がわからない場合は、こちらをご覧ください。

mechanizeを使用してitunesconnectで作業する同様の問題に遭遇しました。多くのフラストレーションの後、cookielib に一部の Cookie を正しく処理しないバグがあることがわかりました。ここで議論されています: http://bugs.python.org/issue3924

その投稿の下部にある修正は私にとってはうまくいきました。便宜上、ここに再投稿します。

基本的に、 のカスタム サブクラスを作成し、これをcookielib.CookieJarオーバーライドして、cookielib jar の代わりに_cookie_from_cookie_tuple使用します。CustomCookieJar

class CustomCookieJar(cookielib.CookieJar):
    def _cookie_from_cookie_tuple(self, tup, request):
        name, value, standard, rest = tup
        version = standard.get("version", None)
        if version is not None:
            # Some servers add " around the version number, this module expects a pure int.
            standard["version"] = version.strip('"')
        return cookielib.CookieJar._cookie_from_cookie_tuple(self, tup,request) 
于 2012-03-21T07:38:49.000 に答える
1

ブラウザでそのリンクをクリックすると、自動的にローカルで iTunes を開こうとします。それは、エラーに記載されている「オフサイト リクエスト」である可能性があります。

私は試してみます:

1) URL の末尾から「?mt=8」を削除します。とにかく必要ではないようで、リクエストと関係がある可能性があります。

2) Scrapy Shell で同じリクエストを試行します。これは、コードをデバッグして新しいことを試すためのはるかに簡単な方法です。詳細はこちら: http://doc.scrapy.org/topics/shell.html?highlight=interactive

于 2010-05-11T21:30:19.813 に答える