我正在使用selenium进行web抓取,然后尝试将数据存储到CSV文件中。我正在使用一个有工人的队列,以使抓取操作更快。
但是,我发现有时一个工作线程会写入CSV,然后另一个尝试写入CSV,导致数据溢出到新行上。
有没有一种安全的方法可以让多个工作进程同时写入一个CSV (或其他文件类型)?
下面是我的worker和queue:
def worker():
while True:
params = q.get()
crawl(*params)
q.task_done()
q = Queue()
for i in range(7):
t = Thread(target=worker)
t.daemon = True
t.start()每次调用'crawl‘时,worker都会将一行写入CSV文件,然后关闭CSV:
data_fd = open('data.csv','a')
data_fd.write(line)
data_fd.close()item_1, item_2, item_3, item_4
item_1, item_2, item_3,
item_1, item_2, item_3, item_4
item_4发布于 2016-02-26 10:21:59
你可以采取两种不同的方法。
1)以某种方式“锁定”文件--在操作系统级别上不是必需的(您可以在写入文件之前获得一个监视器,并在结束时释放,这样在任何时间点,只有一个线程持有监视器并写入文件)。
2)您可以拆分一个单独的线程,专门用于将数据写入csv。爬虫线程抓取数据并将其附加到队列中。csv线程不断地从队列中读取数据并将数据写入磁盘。
这两种方法都有其优点--第一种可能效率较低,但更容易处理。第二种方法需要考虑队列可以增长到多大(以防csv写入变得比抓取慢),并确保在退出应用程序之前排空队列:)
https://stackoverflow.com/questions/35641901
复制相似问题