吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1442|回复: 14
收起左侧

[已解决] python多线程求助(已解决)

[复制链接]
挑灯看花 发表于 2020-7-19 21:54
本帖最后由 挑灯看花 于 2020-7-20 09:01 编辑

本人想编写一个多线程爬虫,利用queue模块。
每次从queue里取一个url,但是爬取需要时间,造成了多个线程取同一个ur,请问怎么解决l

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

518 发表于 2020-7-19 21:58
爬之前pop掉可行吗
bluerabbit 发表于 2020-7-19 22:01
get 怎么会取到同一个元素呢?楼主的程序贴出来看一下
 楼主| 挑灯看花 发表于 2020-7-19 22:01
518 发表于 2020-7-19 21:58
爬之前pop掉可行吗

这样会导致最后几个url没爬完主线程就结束了
涛之雨 发表于 2020-7-19 22:02
可以对爬取的线程进行分配,比如4个线程,每一个线程负责独立的页数
最后处理的时候可以判断总爬取的数量是否等于总数
塞北的雪 发表于 2020-7-19 22:04
从队列里取出一个就删除一个,或者弄个flag,标记运行中
 楼主| 挑灯看花 发表于 2020-7-19 22:06
本帖最后由 挑灯看花 于 2020-7-19 22:14 编辑
bluerabbit 发表于 2020-7-19 22:01
get 怎么会取到同一个元素呢?楼主的程序贴出来看一下

[Python] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class get_video_content(get_video_time,get_user_id):
    def __init__(self,class_id,course_id):
        self.course_id = course_id
        self.class_id = class_id
        get_user_id.__init__(self)
        self.ts = get_timestamp()
        self.url_get_video_content = "".format(course_id)
        self.params_get_video_content = json.dumps({"class_id":class_id})
        self.headers_get_video_content ={""
}
 
        self.cookies = get_cookies()
        self.video_list = []
        self.parse_get_video_list()
        self.video_list_queue = Queue()
        for video_id in self.video_list:
            # get_video_time.__init__(self,course_id,class_id,video_id,self.user_id)
            self.video_list_queue.put(video_id)
         
        self.list_thread = [] #进行多线程部分,其他不重要
        for i in range(5):
            t = threading.Thread(target = self.run_video_queue)
            self.list_thread.append(t)
 
        for t in self.list_thread:
            t.setDaemon(True)
            t.start()
        self.video_list_queue.join()
             
    def run_video_queue(self):
        while True:
            video_id = self.video_list_queue.get()
            get_video_time.__init__(self,self.course_id,self.class_id,video_id,self.user_id)
            self.video_list_queue.task_done()
     
    def parse_get_video_list(self):
        r = requests.post(self.url_get_video_content,headers = self.headers_get_video_content,cookies = self.cookies,data = self.params_get_video_content)
        r = json.loads(r.content.decode())
        for x in r["coursewareArray"]:
            try:
                video_id = x["children"]["items"]["item_id"]
                video_complete = x["done"]
                if not video_complete:
                    self.video_list.append(video_id)
            except:
                pass

代码写的比较烂
删掉丶关于n1 发表于 2020-7-19 23:32
可以设置锁呀 threading.Lock()  做一个def Get_url(self)
[Python] 纯文本查看 复制代码
1
2
3
4
5
if video_list_lock.acquire(True):  # 获得锁
 
    video_list_queue.get()
 
   video_list_lock_lock.release()  # 释放所
JokerX 发表于 2020-7-19 23:33
大概这样
[Python] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
cnt = 0
 
def fun(foo):
    pass
    global cnt
    cnt += 1
 
 
threading.Thread(target=fun, args=(16, )).start()
threading.Thread(target=fun, args=(17, )).start()
threading.Thread(target=fun, args=(18, )).start()
threading.Thread(target=fun, args=(19, )).start()
 
 
while cnt != 4:
    pass
xccxvb 发表于 2020-7-19 23:46
直接用pop就可以了吧,queue为空会自动阻塞的
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-23 21:40

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表