使用urljoin()方法构建完整的绝对URL

import scrapy


class QuotesSpider(scrapy.Spider):
    name = "quotes"
    start_urls = [
        'http://quotes.toscrape.com/page/1/',
    ]

    def parse(self, response):
        for quote in response.css('div.quote'):
            yield {
                'text': quote.css('span.text::text').extract_first(),
                'author': quote.css('small.author::text').extract_first(),
                'tags': quote.css('div.tags a.tag::text').extract(),
            }

        next_page = response.css('li.next a::attr(href)').extract_first()
        if next_page is not None:
            next_page = response.urljoin(next_page)
            yield scrapy.Request(next_page, callback=self.parse)

现在,在提取数据后,parse()方法查找到下一页的链接,使用urljoin()方法构建完整的绝对URL(因为链接可以是相对的),并产生一个新的请求到下一个页面,将自己作为回调函数来处理下一页的数据提取,并保持遍历所有页面的抓取。

在这里您将看到Scrapy的跟随链接机制:当您在回调方法中产生请求时,Scrapy会安排发送请求并注册一个回调方法,以便在请求结束时执行。

使用这种方法,您可以根据您定义的规则构建复杂的抓取工具,并根据所访问的页面提取不同类型的数据。

在我们的例子中,它创建了一个循环,找下一页的所有链接,直到它找不到。这种做法对于抓取分页的博客,论坛和其他网站的链接是很方便的。


猜你喜欢

转载自blog.csdn.net/pythonisnotshell/article/details/80538401
今日推荐