iTunes AppStore中的Scrapy问题

时间:2010-04-10 22:54:38

标签: app-store itunes screen-scraping scrapy

我正在使用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!

追踪(最近一次通话):    在make_cookies中输入文件“/usr/lib/python2.5/cookielib.py”,第1575行      parse_ns_headers(ns_hdrs),request)    文件“/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:int()的基数为10的无效文字:'“1”'

我为其他网站使用了相同的脚本,但我没有遇到此问题。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

当我在浏览器中点击该链接时,它会自动尝试在本地打开iTunes。这可能是错误中提到的“异地请求”。

我会尝试:

1)从URL末尾删除“?mt = 8”。看起来它似乎不需要,它可能与请求有关。

2)在Scrapy Shell中尝试相同的请求。这是一种更简单的方法来调试代码并尝试新事物。更多详情:http://doc.scrapy.org/topics/shell.html?highlight=interactive

答案 1 :(得分:1)

我觉得这篇文章已经很老了,如果你还没弄清楚原因,就在这里。

我遇到了一个使用mechanize与itunesconnect一起工作的类似问题。经过很多挫折后,我发现cookielib中有一个错误,它无法正确处理某些cookie。这里讨论了:http://bugs.python.org/issue3924

该帖子底部的修复对我有用。为方便起见,我会在这里转发。

基本上,您创建了cookielib.CookieJar的自定义子类,覆盖_cookie_from_cookie_tuple并使用此CustomCookieJar代替cookielib jar

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)