python scrapy 从多个解析函数构建相同的项目:在循环中调用第二个解析函数
python scrapy building same item from multiple parse functions : calling second parse function in loop
我正在尝试从多个解析函数构建一个项目,因为我从多个 url 获取数据,
我尝试迭代一个字典(我使用 2 个 for 循环构建)这就是为什么我使用 2 个 for 循环来获取所需的变量来生成 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
(我知道我没有解释代码中的每个细节,但我认为不需要看到我的问题,而不是在你看到从这些印刷品中得到什么之后)
result i get
expected result
也出于某种原因,每次我 运行 spyder 我得到不同的打印随机顺序,这令人困惑,我认为这是关于 yield
我希望有人能帮助我
Scrapy 异步工作(在他们的 official documentation 中解释得很清楚),这就是为什么你的打印顺序看起来随机的原因。
除了顺序之外,预期输出看起来与您获得的结果完全相同。
如果您能解释为什么订单是相关的,我们也许能更好地回答您的问题。
如果你想生成 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})
我正在尝试从多个解析函数构建一个项目,因为我从多个 url 获取数据, 我尝试迭代一个字典(我使用 2 个 for 循环构建)这就是为什么我使用 2 个 for 循环来获取所需的变量来生成 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
(我知道我没有解释代码中的每个细节,但我认为不需要看到我的问题,而不是在你看到从这些印刷品中得到什么之后)
result i get
expected result
也出于某种原因,每次我 运行 spyder 我得到不同的打印随机顺序,这令人困惑,我认为这是关于 yield
我希望有人能帮助我
Scrapy 异步工作(在他们的 official documentation 中解释得很清楚),这就是为什么你的打印顺序看起来随机的原因。 除了顺序之外,预期输出看起来与您获得的结果完全相同。 如果您能解释为什么订单是相关的,我们也许能更好地回答您的问题。
如果你想生成 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})