python3 使用多线程获取数据,出现数据重复,怎么办?

新手练习python 爬虫遇到,使用多线程获取数据,保存到csv 文件,出现数据重复,不知道怎么处理?

我的代码
[https://github.com/huchiwen/L...]

代码基本逻辑如下:

  1. 获取网站的acckey 和 accnum ,用bs解析,从静态html页面获取acckey 和accnum(接口需要这个两个参数)
  2. 使用多线程获取acckey 和accnum,因为数据太多了,不用多线程,耗时间
  3. 保存到csv

现在遇到的问题是:

使用多线程下载出现重复的acckey和accnum.
导致csv 文件很大.
数据出现,重复,图片(部分截图)如下:

数据重复,截图:

阅读 3.2k
1 个回答

大概滤了一下你的代码,你这不叫多线程干一件事,你这是多线程自己干自己的一件事。

提供一下思路吧。
你可以单独起一个线程,或者主线程来搞,生成页码 也就是你的page_code。然后放到一个队列中。这个叫生产者
然后,多线程消费这个队列,去请求数据然后写csv文件。不过这块建议自己写自己的文件。
最后,再将这些csv文件合并一下。


多线程处理数据,一定要注意分工与合并,其实就是ForkJoin。把一个大工程,合理的划分成一些小工程,然后再把这些小工程的结果数据合并一下。


给你个示例:

# -*- coding: UTF-8 -*-
import random
import time
from concurrent.futures import ThreadPoolExecutor
from queue import Queue
import threading

# 声明一个队列
q = Queue()


def producer():
    for item in range(20):
        q.put(str(item))


def consumer():
    while True:
        item = q.get_nowait()
        if not item:
            print('no data exist')
            break
        time.sleep(random.randint(1, 5))
        print('{}->{}'.format(threading.currentThread().getName(), item))


def main():
    producer()
    print('生成数据: qsize->{}'.format(q.qsize()))
    with ThreadPoolExecutor(5) as pool:
        # 这块根据线程池数量,提交相应的任务,因为每个任务都是持续执行的。
        pool.submit(consumer)
        pool.submit(consumer)
        pool.submit(consumer)
        pool.submit(consumer)
        pool.submit(consumer)


if __name__ == '__main__':
    main()
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏