Мета-элемент асинхронного цикла микширования

#web-scraping #scrapy #web-crawler

#очистка веб-страниц #scrapy #веб-сканер

Вопрос:

Я пытаюсь очистить следующий веб-сайт:

https://institucional.xpi.com.br/sobre-a-xp/encontre-um-escritorio/

У меня есть выпадающий список для выбора состояния, из этого состояния он выдает мне выпадающий список из доступных городов.

После отправки я получаю список всех офисов (адрес, электронная почта, номер телефона) для этого города.

С этим кодом я не получаю всех результатов, а также получаю повторяющиеся названия городов, похоже, что мета-элемент микшируется из одного цикла в другой. Я пытался отлаживать, но вот что получается:

Я запускаю первую функцию синтаксического анализа, когда я вхожу в цикл для каждого состояния, я получаю первое состояние («AC»), когда я прихожу к строке yield, я ожидал, что она перейдет к функции parseStates, но она снова запускает цикл.

Дело в том, что он не выполняет весь цикл целиком, он перебирает первые пять состояний, затем переходит к функции parseStates.

 def parse(self, response):

    statesList = ["AC","AL","AM","BA","CE","DF","ES","GO","MA","MG","MS","MT","PA","PB","PE","PR","RJ","RN","RO","RS","SC","SE","SP"]

    for state in statesList:
        linkState = 'https://institucional.xpi.com.br/api/Escritorios/FilialListarCidadesV2?vSiglaEstado='   state
        location = LocationItem()
        location['state']=state

        yield scrapy.Request(url=linkState, callback=self.parseStates, meta={'item':location})

def parseStates(self,response):
        location=response.meta['item']

        root = ET.fromstring(response.body)
        cityList = [city.text for city in root.iter('{http://schemas.datacontract.org/2004/07/XP.Portal.Entities}Nome')]

        for city in cityList:
            location['city']=city
            state = location['state']

            linkCity = 'https://institucional.xpi.com.br/api/Escritorios/FilialListarPorEstadoCidadeV2?vSiglaEstado='   state   'amp;vNomeCidade=' city.replace(' ',' ')
            yield scrapy.Request(url=linkCity, callback=self.parseCities,meta={'item':location})

def parseCities(self,response):
        location = response.meta['item']
        state = location['state']
        city = location['city']

        root = ET.fromstring(response.body)

        mailList = [elem.text for elem in root.iter('{http://schemas.datacontract.org/2004/07/XP.Portal.Entities}EmailPadronizadoSocioResponsavel')]
        companyList = [elem.text for elem in root.iter('{http://schemas.datacontract.org/2004/07/XP.Portal.Entities}RazaoSocial')]
        contactList = [elem.text for elem in root.iter('{http://schemas.datacontract.org/2004/07/XP.Portal.Entities}SocioResponsavel')]
        telList = [elem.text for elem in root.iter('{http://schemas.datacontract.org/2004/07/XP.Portal.Entities}Telefone')]

        for i in range(len(mailList)):
            write(state,city,companyList[i],contactList[i],mailList[i],telList[i])
  

Комментарии:

1. Предполагается, что повторяющиеся города не отображаются, поскольку в каждом городе более одного места проведения?

2. Да, но для всех записей одного и того же штата повторяется название города. Например В штате A есть город 1 с 3 записями и город 2 с 6 записями. На выходе я нахожу состояние A только с городом 2, но с 7 записями. (Не только записи из city 2, но и не все записи)