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