首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多线程web抓取数据的安全存储

多线程web抓取数据的安全存储
EN

Stack Overflow用户
提问于 2016-02-26 09:44:12
回答 1查看 67关注 0票数 1

我正在使用selenium进行web抓取,然后尝试将数据存储到CSV文件中。我正在使用一个有工人的队列,以使抓取操作更快。

但是,我发现有时一个工作线程会写入CSV,然后另一个尝试写入CSV,导致数据溢出到新行上。

有没有一种安全的方法可以让多个工作进程同时写入一个CSV (或其他文件类型)?

下面是我的worker和queue:

代码语言:javascript
复制
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:

代码语言:javascript
复制
data_fd = open('data.csv','a')
data_fd.write(line)
data_fd.close()

代码语言:javascript
复制
item_1, item_2, item_3, item_4
item_1, item_2, item_3, 
item_1, item_2, item_3, item_4 
item_4
EN

回答 1

Stack Overflow用户

发布于 2016-02-26 10:21:59

你可以采取两种不同的方法。

1)以某种方式“锁定”文件--在操作系统级别上不是必需的(您可以在写入文件之前获得一个监视器,并在结束时释放,这样在任何时间点,只有一个线程持有监视器并写入文件)。

2)您可以拆分一个单独的线程,专门用于将数据写入csv。爬虫线程抓取数据并将其附加到队列中。csv线程不断地从队列中读取数据并将数据写入磁盘。

这两种方法都有其优点--第一种可能效率较低,但更容易处理。第二种方法需要考虑队列可以增长到多大(以防csv写入变得比抓取慢),并确保在退出应用程序之前排空队列:)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35641901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档