Python 刮痕:避免循环重新爬行

Python 刮痕:避免循环重新爬行,python,scrapy,Python,Scrapy,我正在为tripAdvisor附近酒店的景点建造一个刮板, scraper将解析如下URL: 我编写了两条规则来获取这些URL,第二条规则用于目标URL的下一个景点页面: Rule(SgmlLinkExtractor(allow=(".*AttractionsNear-g.*",), restrict_xpaths=('.//div[@class="nearby_links wrap"]/a',), unique=True),

我正在为tripAdvisor附近酒店的景点建造一个刮板, scraper将解析如下URL:

我编写了两条规则来获取这些URL,第二条规则用于目标URL的下一个景点页面:

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),
但是在我的目标url中,第一条规则是有效的,刮板将重新爬网到已经解析的url,并从一开始就开始这个过程

我试图通过下载电子邮件来避免循环爬行

class LocationsDownloaderMiddleware(object):
def process_request(self, request, spider):
    if(request.url.encode('ascii', errors='ignore') in deny_domains):
        return IgnoreRequest()
    else: return None
通过管理响应解析中的拒绝域列表

 def parse_item(self, response):
    deny_domains.append(response.url.encode('ascii', errors='ignore'))
但是现在这个中间件阻止了我想要解析的每个url

我怎么办?
谢谢

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
时,这意味着您没有使用
回调
,而只是指定应该“遵循”这些链接,并且规则仍然适用。你可以查看文件


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

在我的情况下,我需要回调并一起跟踪,因为我解析了一些页面,并希望继续到下一页。如果scrapy正在筛选我的请求,则没有问题。谢谢