代理队列结束时停止scrapy

时间:2018-03-16 16:21:21

标签: scrapy middleware scrapy-spider

我有一个ProxyMiddleware,它返回的代理不超过3次,之后就不再使用代理了。

假设我有3个代理,每个代理使用3次。我可以解析9个项目

scrapy队列中有25个项目。当我用完代理时,如何清理队列?或者强迫停止一个棋子?

class CityPolygonsSpider(scrapy.Spider):
name = 'city_polygons'
cities_url = 'http://127.0.0.1:8001/privat-api/cities/?country_code__in=ru,ua,kz,by'

custom_settings = {
    'ITEM_PIPELINES': {
        'geonames.pipelines.CityPolygonPipeline': 300
    },
    'DOWNLOADER_MIDDLEWARES': {
        'geonames.middlewares.ProxyMiddleware': 100,
    },
}

def start_requests(self):
    yield Request(url=self.cities_url, callback=self.parse_next, dont_filter=True)

def parse_next(self, response):
    raw = json.loads(response.body_as_unicode())
    if raw['next']:
        yield Request(url=raw['next'], callback=self.parse_next, dont_filter=True)

    for city in raw['results']:
        city_href = self.search_url + '?' + city['name']
        request = Request(
            url=city_href, callback=self.parse_cities, dont_filter=True)
        request.meta['city_id'] = city['id']
        yield request

def parse_cities(self, response):
    result = json.loads(response.body_as_unicode())['data']
    if result.get('exactResult'):
            yield CityPolygonItem(** result.get('exactResult'))

1 个答案:

答案 0 :(得分:0)

您可以跟踪代理中间件中的代理使用情况。我会使用代理主机的dict:端口组合作为键,并将计数作为值。在每个代理分配上检查字典中的每个条目。如果没有命中数小于3的代理,则引发CloseSpider异常。

以下是文档的相关部分:

https://doc.scrapy.org/en/latest/topics/exceptions.html?highlight=CloseSpider