引擎盖下发生了什么?

Scrapy会调度Spider方法scrapy.Request返回的对象start_requests。在收到每个响应后,它实例化Response对象并调用与请求相关的回调方法(在本例中为 parse方法),将响应作为参数传递。

start_requests方法的快捷方式

您可以只使用URL列表定义类属性,而不是实现从URL start_requests()生成scrapy.Request对象的方法start_urls。然后,默认实现将使用此列表start_requests()来为您的spider创建初始请求:

import scrapy


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

    def parse(self, response):
        page = response.url.split("/")[-2]
        filename = 'quotes-%s.html' % page
        with open(filename, 'wb') as f:
            f.write(response.body)

parse()即使我们没有明确告诉Scrapy这样做,也会调用该方法来处理这些URL的每个请求。发生这种情况的原因parse()Scrapy的默认回调方法,在没有明确分配回调的情况下调用请求。