2010-04-10 77 views
2

我正在使用Scrapy從iTunes的AppStore數據庫中獲取一些數據。我從這個應用程序列表開始:http://itunes.apple.com/us/genre/mobile-software-applications/id36?mt=8Scrapy問題與iTunes的AppStore

在下面的代碼中,我使用了最簡單的正則表達式,它針對美國商店中的所有應用程序。

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 餅乾= self._cookie_from_cookie_tuple(TUP,請求) 文件「/ usr/lib中/ python2.5/cookielib.py「,行1451,在_cookie_from_cookie_tuple 如果版本不是None:version = int(version) ValueError:無效文字爲int()與基地10:'」1「'

我對其他網站使用了相同的腳本,我沒有這個問題。

有什麼建議嗎?

+0

的使用CustomCookieJar爲了儘可能的異地請求進入,嘗試添加該屬性到你的蜘蛛:'allowed_domains = ['apple.com']' – 2012-03-21 08:54:31

回答

1

當我在瀏覽器中點擊該鏈接時,它會自動嘗試在本地打開iTunes。這可能是錯誤中提到的「異地請求」。

我會嘗試:

1)從URL的末尾刪除 「MT = 8?」。看起來它不需要它,它可能與請求有關。

2)在Scrapy Shell中嘗試相同的請求。這是一個更簡單的方法來調試你的代碼並嘗試新事物。更多細節在這裏:http://doc.scrapy.org/topics/shell.html?highlight=interactive

1

我看到這篇文章是非常古老的,如果你還沒有找到原因,那麼在這裏。

我遇到類似的問題,使用機械化itunesconnect工作。經過很多挫折後,我發現cookielib中存在一個錯誤,它無法正確處理一些cookie。這裏討論:http://bugs.python.org/issue3924

該帖子底部的修復程序適用於我。爲了方便起見,我會在這裏重新發布。

基本上你創建cookielib.CookieJar自定義子類,覆蓋_cookie_from_cookie_tuple和到位的cookielib罐子

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)