scrapy:避免循环重新爬行

时间:2015-07-20 22:19:10

标签: python scrapy

我正在为tripAdvisor附近的景点建造刮刀, 刮刀将解析这样的网址:http://www.tripadvisor.com/AttractionsNear-g55711-d1218038-oa30-Dallas_Addison_Marriott_Quorum_By_the_Galleria-Dallas_Texas.html

我写了两个规则来获取这些网址,第二个是针对目标网址的下一个景点页面:

Rule(SgmlLinkExtractor(allow=(".*AttractionsNear-g.*",),
                           restrict_xpaths=('.//div[@class="nearby_links wrap"]/a',), unique=True),
         callback='parse_item', follow=True),
    Rule(SgmlLinkExtractor(allow=(".*AttractionsNear-g.*",),
                           restrict_xpaths=('.//div[@class="pgLinks"]/a[contains(@class, "pageNext")]',), unique=True),
         callback='parse_item', follow=True),

但是在我的目标网址中,第一个规则是有效的,并且抓取工具将重新抓取到已解析的网址,并将从开始开始。

我试图避免DownloaderMiddleware

的循环抓取
class LocationsDownloaderMiddleware(object):
def process_request(self, request, spider):
    if(request.url.encode('ascii', errors='ignore') in deny_domains):
        return IgnoreRequest()
    else: return None

并通过在响应解析中管理deny_domains list-

 def parse_item(self, response):
    deny_domains.append(response.url.encode('ascii', errors='ignore'))

但现在这个中间件阻止了我要解析的每个网址。

我该如何管理它? 感谢

1 个答案:

答案 0 :(得分:2)

SgmlLinkExtractor已停止使用,您应该使用scrapy.linkextractors.LinkExtractor

现在您的规则应如下所示:

rules = (
    Rule(
        LinkExtractor(
            restrict_xpaths=['xpath_to_category'],
            allow=('regex_for_links')
        ),
        follow=True,
    ),
    Rule(
        LinkExtractor(
            restrict_xpaths=['xpath_to_items'],
            allow=('regex_to_links')
        ),
        callback='some_parse_method',
    ),
)

当您指定follow=True时,表示您没有使用callback,而只是指定应该“遵循”这些链接并且规则仍然适用。您可以查看文档here

此外,它不会发出重复请求,因为scrapy正在过滤它。