设置下载延迟时,Scrapy行为会发生变化

时间:2017-11-14 02:38:46

标签: scrapy scrapy-spider

这是我的scrapy蜘蛛

class Spider(scrapy.Spider):
    name = "name"
    start_urls = ["https://www.aurl"]

    def parse(self, response):
        links_page_urls = response.css("a.dynamic-linkset::attr(href)").extract()
        for url in contract_page_urls:
            yield response.follow(url, callback=self.parse_list_page)

        next_data_cursor = response.css("li.next").css("a::attr(href)").extract_first()
        if next_data_cursor:
            self.log("going to next page - {}".format(next_data_cursor))
            yield response.follow(next_data_cursor, callback=self.parse)

    def parse_list_page(self, response):
        list =  response.css("div.row div.list-group a.list-group-item").css("a::attr(href)").extract()
        for url in list:
            self.log("url - {}".format(url))
            yield scrapy.Request(url=self.base_url + url, callback=self.parse_page)

    def parse_page(self, response):
        #Lots of code for parsing elements from a page
        # build an item and return it

我的观察是,在我自己的家中机器上没有设置download delay,实际页面会快速连续访问并保存到mongo。当我将此代码移动到EC2实例并将下载延迟设置为60时,我现在注意到的是,不会访问网页进行抓取,而是访问第一个页面,下一个数据令牌被抓取并访问它。然后我看到很多与打印列表页面相关的打印输出而不是每个单独的页面。

所需的行为是访问初始URL,获取页面列表,然后访问每个页面并将其抓取,然后转到下一个数据光标并重复此过程。

1 个答案:

答案 0 :(得分:1)

您可以尝试设置更低的DOWNLOAD_DELAY(可能是= 2)并设置CONCURRENT_REQUESTS = 1为页面列表中的请求分配更高的优先级,例如:

yield response.follow(url, callback=self.parse_list_page, priority=1)