无码av一区二区三区无码,在线观看老湿视频福利,日韩经典三级片,成 人色 网 站 欧美大片在线观看

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

12. 爬蟲之多線程

2020-06-30 11:51 作者:自學(xué)Python的小姐姐呀  | 我要投稿

1. 引入

我們之前寫的爬蟲都是單個線程的?這怎么夠?一旦一個地方卡到不動了,那不就永遠(yuǎn)等待下去了?為此我們可以使用多線程或者多進程來處理。

不建議你用這個,不過還是介紹下了,如果想看可以看看下面,不想浪費時間直接看

2. 如何使用

爬蟲使用多線程來處理網(wǎng)絡(luò)請求,使用線程來處理URL隊列中的url,然后將url返回的結(jié)果保存在另一個隊列中,其它線程在讀取這個隊列中的數(shù)據(jù),然后寫到文件中去

3. 主要組成部分

3.1 URL隊列和結(jié)果隊列

將將要爬去的url放在一個隊列中,這里使用標(biāo)準(zhǔn)庫Queue。訪問url后的結(jié)果保存在結(jié)果隊列中

初始化一個URL隊列

from queue import Queue
urls_queue = Queue()
out_queue = Queue()

3.2 請求線程

使用多個線程,不停的取URL隊列中的url,并進行處理:

import threading

class ThreadCrawl(threading.Thread):
? ?def __init__(self, queue, out_queue):
? ? ? ?threading.Thread.__init__(self)
? ? ? ?self.queue = queue
? ? ? ?self.out_queue = out_queue

? ?def run(self):
? ? ? ?while True:
? ? ? ? ? ?item = self.queue.get()

如果隊列為空,線程就會被阻塞,直到隊列不為空。處理隊列中的一條數(shù)據(jù)后,就需要通知隊列已經(jīng)處理完該條數(shù)據(jù)

3.3 處理線程

處理結(jié)果隊列中的數(shù)據(jù),并保存到文件中。如果使用多個線程的話,必須要給文件加上鎖

lock = threading.Lock()
f = codecs.open('out.txt', 'w', 'utf8')

當(dāng)線程需要寫入文件的時候,可以這樣處理:

with lock:
? ?f.write(something)

4. Queue模塊中的常用方法:

Python的Queue模塊中提供了同步的、線程安全的隊列類,包括FIFO(先入先出)隊列Queue,LIFO(后入先出)隊列LifoQueue,和優(yōu)先級隊列PriorityQueue。這些隊列都實現(xiàn)了鎖原語,能夠在多線程中直接使用??梢允褂藐犃衼韺崿F(xiàn)線程間的同步

  • Queue.qsize() 返回隊列的大小

  • Queue.empty() 如果隊列為空,返回True,反之False

  • Queue.full() 如果隊列滿了,返回True,反之False

  • Queue.full 與 maxsize 大小對應(yīng)

  • Queue.get([block[, timeout]])獲取隊列,timeout等待時間

  • Queue.get_nowait() 相當(dāng)Queue.get(False)

  • Queue.put(item) 寫入隊列,timeout等待時間

  • Queue.put_nowait(item) 相當(dāng)Queue.put(item, False)

  • Queue.task_done() 在完成一項工作之后,Queue.task_done()函數(shù)向任務(wù)已經(jīng)完成的隊列發(fā)送一個信號

  • Queue.join() 實際上意味著等到隊列為空,再執(zhí)行別的操作


12. 爬蟲之多線程的評論 (共 條)

分享到微博請遵守國家法律
城口县| 额尔古纳市| 普陀区| 文登市| 庐江县| 江孜县| 肇庆市| 兰坪| 屏东市| 阿瓦提县| 黄龙县| 六安市| 汝阳县| 炎陵县| 天柱县| 莲花县| 丰镇市| 拜城县| 文山县| 三门峡市| 肇源县| 阿克| 柳州市| 沙雅县| 穆棱市| 工布江达县| 睢宁县| 永靖县| 钟祥市| 保德县| 剑阁县| 绥芬河市| 张掖市| 三门峡市| 渝中区| 松阳县| 蒙自县| 和平区| 政和县| 那曲县| 芮城县|