#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, но и не все записи)