我有一个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'))
答案 0 :(得分:0)
您可以跟踪代理中间件中的代理使用情况。我会使用代理主机的dict:端口组合作为键,并将计数作为值。在每个代理分配上检查字典中的每个条目。如果没有命中数小于3的代理,则引发CloseSpider异常。
以下是文档的相关部分:
https://doc.scrapy.org/en/latest/topics/exceptions.html?highlight=CloseSpider