【问题标题】:scrapy: avoid circular re-crawlingscrapy:避免循环重新爬行
【发布时间】:2015-07-20 22:19:09
【问题描述】:

我正在为tripAdvisor附近酒店的景点构建一个刮板, 刮板会像这样解析网址:http://www.tripadvisor.com/AttractionsNear-g55711-d1218038-oa30-Dallas_Addison_Marriott_Quorum_By_the_Galleria-Dallas_Texas.html

我写了两条规则来获取这些 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 并将从头开始该过程。

我试图避免 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 列表

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

但现在这个中间件正在阻止我要解析的每个 url。

我该如何管理它? 谢谢

【问题讨论】:

    标签: python scrapy


    【解决方案1】:

    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 正在过滤它。

    【讨论】:

    • 在我的情况下,我需要回调并一起关注,因为我解析了一些页面并希望继续到下一页。如果scrapy 正在过滤我的请求,则没有问题。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多