0

我正在使用具有两条规则的 CrawlSpider。一条规则将文章链接从页面中取出,并将它们发送出去以存储在 CSV 中。另一个找到“下一页”链接并跟随它。

但是,下一页链接总是返回有点混乱。因此,我需要修复 URL(我可以这样做),然后让该页面抓取更多链接(我不知道该怎么做)。

从我读过的内容来看,我似乎需要创建一个请求,但不幸的是我并不真正了解它是如何工作的。该请求是否意味着给它的页面将像所有其他页面一样被抓取?我的 CrawlSpider 规则是否仍适用于该页面上的链接?

我曾尝试使用 Request(),但似乎没有遵循该链接。我检查了链接,它工作正常,并且该页面上有链接可供关注。

这是代码:

class MySpider(CrawlSpider):
    name = 'ContentSpider'
    allowed_domains = ['bbc.co.uk']
    start_urls = ['http://www.bbc.co.uk/search/news/?q=credit card']

    rules = (
        Rule(SgmlLinkExtractor(restrict_xpaths=('//div[@class="cmWidget news"]/div[@id="news-content"]'), allow=('http\:\/\/www\.bbc\.co\.uk\/news\/.')), callback='parse_item', follow=False),
        Rule(SgmlLinkExtractor(restrict_xpaths=('//div[@class="pagination"]'), allow=()), callback='parse_follow'),
    )

    def __init__(self, **kwargs):
        CrawlSpider.__init__(self, **kwargs)
        logfile = open('testlog.log', 'w')
        log_observer = ScrapyFileLogObserver(logfile, level=logging.DEBUG)
        log_observer.start()
        log.start(loglevel=logging.DEBUG)

    def parse_item(self, response):
        item = CreditcrawlerItem()
        item['url'] = response.url
        return item

    def parse_follow(self, response):
        marker1 = response.url.find("?") + 1
        marker2 = response.url.find("page")
        fixed_url = response.url[:marker1] + response.url[marker2:] + "&" + response.url[marker1:marker2 - 1]
        fixed_url = fixed_url.replace("+"," ")
        return Request(fixed_url)

谢谢你的帮助。综上所述,问题是我需要关注这些“下一页”链接,但链接坏了。我可以修复链接,但我不知道如何再次关注它们。

4

1 回答 1

1

我认为您想要的是(请参阅此链接process_value)的参数,您可以在其中引用从提取的链接中获取值的函数,并且您可以在蜘蛛抓取链接之前更改它们的值。SgmlLinkExtractorhref

下面,您的第二条规则被更改为定义回调,因此内置的 crawl-and-parseCrawlSpider将用于查找新链接。您的parse_follow方法更改为常规函数,在此非常引用Rule

def fix_url(url):
    marker1 = url.find("?") + 1
    marker2 = url.find("page")
    fixed_url = url[:marker1] + url[marker2:] + "&" + url[marker1:marker2 - 1]
    fixed_url = fixed_url.replace("+"," ")
    return fixed_url

class MySpider(CrawlSpider):
    name = 'ContentSpider'
    allowed_domains = ['bbc.co.uk']
    start_urls = ['http://www.bbc.co.uk/search/news/?q=credit card']

    rules = (
        Rule(
            SgmlLinkExtractor(
                restrict_xpaths=('//div[@class="cmWidget news"]/div[@id="news-content"]'),
                allow=('http\:\/\/www\.bbc\.co\.uk\/news\/.')),
            callback='parse_item',
            follow=False),
        Rule(
            SgmlLinkExtractor(
                restrict_xpaths=('//div[@class="pagination"]'),
                process_value=fix_url)),
    )

    def __init__(self, **kwargs):
        CrawlSpider.__init__(self, **kwargs)
        logfile = open('testlog.log', 'w')
        log_observer = ScrapyFileLogObserver(logfile, level=logging.DEBUG)
        log_observer.start()
        log.start(loglevel=logging.DEBUG)

    def parse_item(self, response):
        item = CreditcrawlerItem()
        item['url'] = response.url
        return item
于 2013-08-14T20:52:50.213 回答