python Скопировать создание одного и того же элемента из нескольких функций анализа: вызов второй функции анализа в цикле - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь построить элемент из многих функций синтаксического анализа, потому что я получаю данные из нескольких URL-адресов, я пытаюсь перебрать словарь (который я построил, используя 2 для циклов), поэтому я использую 2 для циклов, чтобы получить необходимую переменную для сгенерируйте URL, а затем для каждой переменной я вызываю вторую функцию синтаксического анализа, передавая необходимый URL, именно здесь я хочу вызвать вторую функцию синтаксического анализа из моего основного синтаксического анализа

   for r in [1,2]:
      for t in [1,2]:
        dataName = 'lane'+str(r)+"Player"+str(t)+"Name"
        dataHolder = 'lane'+str(r)+"Player"+str(t)
        nameP = item[dataName]
        print('before parse ==> lane = ' + str(r) + "  team = " + str(t))
        urlP = 'https://www.leagueofgraphs.com/summoner/euw/'+nameP+'#championsData-soloqueue'
        yield Request( urlP, callback=self.parsePlayer , meta={'item': item , "player" : dataHolder} )  

Я использую эти prints (), чтобы увидеть в выводе, как мой код выполняет то же самое в моей второй функции синтаксического анализа, которая выглядит следующим образом:

def parsePlayer( self , response ):
  item = response.meta['item']
  player = response.meta['player']
  print('after parse ====> ' + player)
  mmr = response.css('.rank .topRankPercentage::text').extract_first().strip().lower()
  mmrP = player+"Mmr"
  item[mmrP] = mmr
  # yield item after the last iteration

(я знаю, что я не объяснил все детали в коде, но я думаю, что нет необходимости видеть мою проблему, не после того, как вы видите, что получают от этих отпечатков)

результат я получаю

ожидаемый результат

также по какой-то причине каждый раз я запускаю spyder я получаю разные случайные порядки отпечатков, это сбивает с толку я думаю, это что-то о yield я надеюсь, что кто-то может помочь мне с этим

1 Ответ

0 голосов
/ 28 апреля 2020

Scrapy работает асинхронно (как ясно объяснено в их официальной документации ), поэтому порядок ваших отпечатков выглядит случайным. Помимо заказа, ожидаемый результат выглядит точно так же, как результат, который вы получаете. Если вы можете объяснить, почему порядок важен, мы могли бы лучше ответить на ваш вопрос.

Если вы хотите получить 1 предмет с данными всех 4 игроков, можно использовать следующую структуру:

    def start_requests(self):
        # prepare the urls & players:
        urls_dataHolders = []
        for r in [1, 2]:
            for t in [1, 2]:
                dataName = 'lane' + str(r) + "Player" + str(t) + "Name"
                dataHolder = 'lane' + str(r) + "Player" + str(t)
                urlP = 'https://www.leagueofgraphs.com/summoner/euw/' + dataName\
                       + '#championsData-soloqueue'
                urls_dataHolders.append((urlP, dataHolder))

        # get the first url & dataholder
        url, dataHolder = urls_dataHolders.pop()
        yield Request(url,
                      callback=self.parsePlayer,
                      meta={'urls_dataHolders': urls_dataHolders,
                            'player': dataHolder})

    def parsePlayer(self, response):
        item = response.meta.get('item', {})
        urls_dataHolders = response.meta['urls_dataHolders']
        player = response.meta['player']
        mmr = response.css(
            '.rank .topRankPercentage::text').extract_first().strip().lower()
        mmrP = player + "Mmr"
        item[mmrP] = mmr
        try:
            url, dataHolder = urls_dataHolders.pop()
        except IndexError:
            # list of urls is empty, so we yield the item
            yield item
        else:
            # still urls to go through
            yield Request(url,
                          callback=self.parsePlayer,
                          meta={'urls_dataHolders': urls_dataHolders,
                                'item': item,
                                'player': dataHolder})
...