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

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

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

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

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

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

Я запускаю первую функцию синтаксического анализа, когда я вхожу в цикл для каждого состояния, я получаю первое состояние («AC»), когда я прихожу к линии доходностиЯ ожидал, что он перейдет к функции 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 + '&vNomeCidade='+city.replace(' ','%20')
            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])
...