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 中,如果版本不是无:version = int(version) ValueError: int() 以 10 为底的无效文字:'"1"'

我在其他网站上使用了相同的脚本,我没有这个问题。

有什么建议吗? 

4

2 回答 2

1

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

我会尝试:

1) 从 URL 的末尾删除“?mt=8”。看起来无论如何都不需要它,它可能与请求有关。

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

于 2010-05-11T21:30:19.813 回答
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) 
于 2012-03-21T07:38:49.000 回答