【spider】多線程爬蟲

多線程工作原理

多線程示意圖

?

Queue(隊列對象)

queue是python中的標準庫,可以直接from queue import Queue引用;隊列是線程間最常用的交換數據的形式

?

python下多線程的思考

對于資源,加鎖是個重要的環節。Queue,是線程安全的,因此在滿足使用條件下,建議使用隊列

?

創建一個“隊列”對象?

pageQueue = Queue(10)

?


將一個值放入隊列中

for page in range(1, 11):
? ?pageQueue.put(page)

?


將一個值從隊列中取出

pageQueue.get()

?

隊列Queue

Queue線程安全
?? ?queue是python中的標準庫,可以直接from queue import Queue引用;隊列是線程間最常用的交換數據的形式
?? ?創建一個“隊列”對象
?? ?隊列常用方法
?? ??? ?put()
?? ??? ?get(block)
?? ??? ?empty()
?? ??? ?full()
?? ??? ?qsize()

隊列鎖與線程鎖

import threading
from queue import  Queue
dataQueue = Queue(100)
exitFlag = Falseclass MyThread(threading.Thread):def __init__(self,q):super().__init__()self.queue = qdef run(self):super().run()global exitFlagwhile True:if exitFlag:print('++++++++++++++++++++++++++exit')breaktry:print('------------------------',self.queue.get(False))self.queue.task_done()except:passdef main():for i in range(100):dataQueue.put(i)threads = []for i in range(5):thread = MyThread(dataQueue)threads.append(thread)thread.start()# 隊列鎖# dataQueue.join()global  exitFlagexitFlag = Trueprint('exit ------------------------------------------------')# 線程鎖for t in threads:t.join()if __name__ == '__main__':main()

另一個實例 爬去讀書網站

import requests
from bs4 import BeautifulSoup
from queue import Queue
import threading
from threading import Lock
url = 'https://www.dushu.com/book/1175_%d.html'
task_queue = Queue(100)
parse_queue = Queue(100)
headers = {'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
'Accept-Encoding':'gzip, deflate, br',
'Accept-Language':'zh-CN,zh;q=0.9',
'Cache-Control':'max-age=0',
'Connection':'keep-alive',
'Cookie':'Hm_lvt_8008bbd51b8bc504162e1a61c3741a9d=1572418328; Hm_lpvt_8008bbd51b8bc504162e1a61c3741a9d=1572418390',
'Host':'www.dushu.com',
'Sec-Fetch-Mode':'navigate',
'Sec-Fetch-Site':'none',
'Sec-Fetch-User':'?1',
'Upgrade-Insecure-Requests':'1',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',}
# 解析線程退出的標記
exit_flag = False# 相當于線程池
class CrawlThread(threading.Thread):def __init__(self, q_task:Queue,q_parse:Queue) -> None:super().__init__()self.q_task = q_taskself.q_parse = q_parsedef run(self) -> None:super().run()self.spider()# 一直干活def spider(self):while True:if self.q_task.empty():print('+++++++爬蟲線程%s執行任務結束+++++++'%(threading.current_thread().getName()))breaktaskId = self.q_task.get()response = requests.get(url % (taskId), headers = headers)response.encoding = 'utf-8'html = response.textself.q_parse.put((html,taskId))self.q_task.task_done()print('------爬蟲線程:%s-----執行任務:%d-------'%(threading.current_thread().getName(),taskId))
# 專心爬蟲
def crawl():for i in range(1,101):task_queue.put(i)for i in range(5):t = CrawlThread(task_queue,parse_queue)t.start()class ParseThread(threading.Thread):def __init__(self,q_parse:Queue,lock:Lock,fp):super().__init__()self.q_parse = q_parseself.lock = lockself.fp = fpdef run(self):super().run()self.parse()def parse(self):while True:if exit_flag:print('-----------解析線程:%s完成任務退出------------'%(threading.current_thread().getName()))breaktry:html,taskId = self.q_parse.get(block=False)soup = BeautifulSoup(html,'lxml')books = soup.select('div[class="bookslist"] > ul > li')print('----------------',len(books))for book in books:self.lock.acquire()book_url = book.find('img').attrs['src']book_title = book.select('h3 a')[0]['title']book_author = book.select('p')[0].get_text()book_describe = book.select('p')[1].get_text()fp.write('%s\t%s\t%s\t%s\n'%(book_url,book_title,book_author,book_describe))self.lock.release()self.q_parse.task_done()print('**********解析線程:%s完成了第%d頁解析任務***********'%(threading.current_thread().getName(),taskId))except :pass
# 專心的負責網頁解析,保存
def parse(fp):lock = Lock()for i in range(5):t = ParseThread(parse_queue,lock,fp)t.start()
if __name__ == '__main__':crawl()fp = open('./book.txt','a',encoding='utf-8')parse(fp)# 隊列join:隊列中的任務必須結束,下面才會執行task_queue.join()parse_queue.join()fp.close()exit_flag = Trueprint('代碼執行到這里!!!!!!!!!!!!!!')

多線程實現
?? ?讀書http://www.qwsy.com/shuku.aspx?&page=1
?? ?導包
?? ?定義變量
?? ?創建爬蟲線程并啟動
?? ??? ?爬蟲線程
?? ?創建解析線程并啟動
?? ??? ?解析線程
?? ??? ??? ?Queue.get(block = True/False)
?? ?join()鎖定線程,確保線程全部執行完畢
?? ?結束任務

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/456225.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/456225.shtml
英文地址,請注明出處:http://en.pswp.cn/news/456225.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

css設置文字上下居中,一行文字居中,兩行或多行文字同樣居中。

HTML: <div class"book-detail-store-item align-center-vertical">居中文字</div> CSS: .book-detail-store-item {width: 50px&#xff1b;height&#xff1a;50px&#xff1b;line-height: 25px;font-size: 12px;}/*flex垂直居中對齊*/ .align-center…

MySQL/sqlserver查詢in操作 查詢結果按in集合順序顯示

2019獨角獸企業重金招聘Python工程師標準>>> MySQL/sqlserver查詢in操作 查詢結果按in集合順序顯示 MySQL用下面的語句 select * from ibs6_terminal_adv_inf where id in (16,14,15) order by field(id,16,14,15) select * from ibs6_terminal_adv_inf where id in…

【機器學習】opencv-人臉識別

一 . opencv是什么及其作用&#xff1f; OpenCV是一個基于BSD許可&#xff08;開源&#xff09;發行的跨平臺計算機視覺庫&#xff0c;可以運行在Linux、Windows、Android和Mac OS操作系統上。它輕量級而且高效——由一系列 C 函數和少量 C 類構成&#xff0c;同時提供了Python…

關于java中的集合如何刪除一個元素。

我們有三種方法可以刪除集合中的元素&#xff0c;下面介紹兩種方法&#xff0c; 一種是傳統的for循環&#xff0c;另一種是使用Iterator迭代器(推薦使用)&#xff0c;簡單的介紹如下&#xff1a; for循環刪除元素: public class ForRemove<T>{ public void forDelete(…

她說程序員不懂浪漫,生日宴上慘變單身狗,其實,程序員的浪漫你不懂!

css蛋糕誰說程序員不懂得浪漫&#xff0c;只是程序員的浪漫你不懂&#xff01;PS&#xff1a;人家都不懂&#xff0c;你再浪漫有啥用&#xff0c;最后還不是單身狗&#xff1f;說實在的&#xff0c;以前也分享過一個程序員用純CSS畫的一個MAC&#xff0c;代碼就三千多行&#x…

H.264 picture parameter sets成員值含義學習筆記

-picture parameter sets1. pic_parameter_set_idpic_parameter_set_id指明了在切片頭中對應的某個psp.pic_parameter_set_id的值應該在0到255,包括0和2552. seq_parameter_set_idset_parameter_set_id表示激活的sps.seq_parameter_set_id應該取值在0到31之間,包括邊界值.3. en…

【機器學習】opencv-數據預處理

想要將收集好的數據s進行統一命名 數量整理 就需要提前進行預處理 import numpy as npimport osimport randomimport cv2 # wuao文件名修改&#xff0c;1~10文件名 filename os.listdir(./faces/wuao/) for i,name in enumerate(filename):os.rename(./faces/wuao/%s%(name)…

WIN7如何替換開機登錄畫面

1 把你的圖片保存為backgroundDefault.jpg,并確保和你的屏幕分辨率相同 2 把下面的代碼另存為開啟自定義登錄界面.reg&#xff08;注意格式為ASCII格式&#xff09; Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\A…

Resharper 安裝以及破解

首先進行軟件安裝 安裝后 解壓下載好的 文件 會得到如下&#xff1a; 打開序列號 會看到 然后 復制 %LocalAppData%\\JetBrains 路徑 會得到進入當前JetBrains 文件夾 然后搜索 JetBrains.Platform.Shell.dll 會得到這個文件 點擊屬性 查看到后半段的地址 \AppData\Local\JetB…

【機器學習】圖片中的人臉識別

通過opencv三方庫進行圖片人臉識別 face_zones中的參數可以自行調試,這三個data都可以用于人臉識別 haarcascade_frontalface_default.xmlhaarcascade_frontalface_alt.xmlhaarcascade_frontalface_alt2.xml import numpy as npimport cv2img cv2.imread(./2ren.jpg) img.s…

Android Fragment

Fragment在3.0后增加&#xff1a;android.app.Fragment。在v4的兼容包里也有。 一般為了兼容性還是可能會用&#xff1a;android.support.v4.app.Fragment 生命周期&#xff1a; onAttach,onCreate,onCreateView,onActivityCreated,onStart,onResume, onPause,onStop,onDestroy…

1020. 月餅 (25)

1020. 月餅 (25) 月餅是中國人在中秋佳節時吃的一種傳統食品&#xff0c;不同地區有許多不同風味的月餅。現給定所有種類月餅的庫存量、總售價、以及市場的最大需求量&#xff0c;請你計算可以獲得的最大收益是多少。 注意&#xff1a;銷售時允許取出一部分庫存。樣例給出的情形…

【機器學習】opencv-視頻中的人臉檢測

本次在圖片識別的程度上增添了視頻識別 原理就是在圖片的基礎上進行操作 每毫秒進行下一幀的人臉解析識別&#xff0c;時間可自行設置 import numpy as np import cv2win cv2.namedWindow(dzd,cv2.WINDOW_NORMAL) cv2.resizeWindow(dzd,640,200) rose cv2.imread(./rose.jp…

scan8[16+2*4]的內容

scan8確實不好理解&#xff0c;解答如下&#xff1a; static const int x264_scan8[162*4] { /* Luma */ 41*8, 51*8, 42*8, 52*8, 61*8, 71*8, 62*8, 72*8, 43*8, 53*8, 44*8, 54*8, 63*8, 73*8, 64*8, 74*8, /* Cb */ 11*8, 21*8, 12*8, 22*8, /…

React 產品實現 -任務管理工具“氫”

原文地址&#xff1a;https://zhuanlan.zhihu.com/p/...&#xff0c;歡迎轉載 &#xff1a;-&#xff09;? 關于 其實對于這個專欄的訂閱用戶感到非常抱歉&#xff0c;已經停更很久了&#xff0c;也沒啥特別的理由就是懶 orz&#xff01;不對&#xff0c;畫風不能這樣開頭&…

通過curl獲取網頁訪問時間

curl -w %{time_namelookup}:%{time_connect}:%{time_starttransfer}:%{time_total}:%{speed_download}"\n" "https://www.google.com" 轉載于:https://www.cnblogs.com/fanxuanhui-linux/p/6581292.html

【numpy】20道numpy題目

1、創建一個長度為10的一維全為0的ndarray對象&#xff0c;然后讓第5個元素等于1 import numpy as npndarry np.zeros(10) ndarryarray([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])ndarry[4]1 ndarryarray([0., 0., 0., 0., 1., 0., 0., 0., 0., 0.])2、創建一個元素為從10到4…

ffmpeg_intra_pred_mode問題.pdf

ffmpeg_intra_pred_mode問題.pdf文章

【R】語言第一課-----安裝

安裝R和Rstuido軟件 R語言是用于統計分析&#xff0c;圖形表示和報告的編程語言和軟件環境&#xff1b;Rstudio是編輯、運行R語言的最為理想的工具之一。 1、官網下載R安裝包 下載地址為&#xff1a;https://cran.r-project.org 進入鏈接&#xff0c;如下圖所示&#xff0c…

面向對象基礎知識整理

1、什么是對象&#xff1f; 什么是類&#xff1f; 對象是可以看的見摸得著的&#xff0c;對象可以是任何東西&#xff0c;比如水杯&#xff0c;書&#xff0c;手機等。準確的說&#xff0c;對象是一個自包含的實體&#xff0c;用一組可識別的特性和行為標識的。 類就是具有相同…