Python 爬虫将数据更新到数组中,在循环中产生

Python 爬虫将数据更新到数组中,在循环中产生,python,scrapy,web-crawler,Python,Scrapy,Web Crawler,我想使用循环连续爬网和更新数组值,因为我需要单击一些按钮来获取数组上的下一个值。 然而,看起来屈服内部循环就像并行线程一样工作,并且项目多次被屈服。 我想要的是通过循环,更新数据并只产生一次项。 例子: 电流输出: {'field1': 'data1', 'filed2' : 'data2', 'field3' : ['data31']} {'field1': 'data1', 'filed2' : 'data2', 'field3' : ['data32']} {'field1':

我想使用循环连续爬网和更新数组值,因为我需要单击一些按钮来获取数组上的下一个值。 然而,看起来屈服内部循环就像并行线程一样工作,并且项目多次被屈服。 我想要的是通过循环,更新数据并只产生一次项。 例子: 电流输出:

{'field1': 'data1',
 'filed2' : 'data2',
 'field3' : ['data31']}

{'field1': 'data1',
 'filed2' : 'data2',
 'field3' : ['data32']}

{'field1': 'data1',
 'filed2' : 'data2',
 'field3' : ['data33']}
预期:

{'field1': 'data1',
 'filed2' : 'data2',
 'field3' : ['data31', 'data32', 'data3']}
这是我的密码

def parse_individual_listings(self, response):
     ...
     data = {}
     data[field1] = 'data1'
     data[field1] = 'data2'
     ...
     for i in range(3):
         yield scrapy.Request(
                urlparse.urljoin(response.url, link['href']), #different link
                callback=self.parse_individual_tabs,
                meta={'data': data, 'n':i};
         )
def parse_individual_tabs(self, response):
     data = response.meta['data']
     i = response.meta['i']
     ...
     # keep populating `data`
     data[field3][i] = "data3[i]"  #this value change when I click a button to update
     yield data

尝试使用
inline\u请求
library()。它允许您在同一个函数中发出请求。将数据收集到一个对象而不是生成不同的对象是很有用的。使用一些伪代码检查此示例:

from inline_requests import inline_requests
from scrapy import Selector

@inline_requests
def parse_individual_listings(self, response):
    ...
    data = {}
    data[field1] = 'data1'
    data[field1] = 'data2'
     ...
    for i in range(3):
        extra_req = yield scrapy.Request(
            response.urljoin(link['href']), #different link
        )
        # apply your logics here, say extract some data
        sel = Selector(text=extra_req.text)
        data['field3'].append(sel.css('some css selector').get())
    yield data

按照多线程和非同步的想法,我最终在parse_individual_选项卡中使用了互斥锁,它似乎工作得很好

from threading import Lock
...
mutex = Lock()
count = 0
...
def parse_individual_tabs(self, response):
 self.mutex.acquire(1)
 try:
    count += 1
    data = response.meta['data']
    i = response.meta['i']
    ...
    # keep populating `data`
    data[field3][i] = "data3[i]"  #this value change when I click a button to update
 finally:
        self.mutex.release()
 if (count == 3):   #check if this is callback of last yield Request
     yield data
 else:
     return