隊(duì)列
創(chuàng)建一個(gè)隊(duì)列:queue_obj = queue.Queue(maxsize=30)
maxsize :表示允許存儲的最
(FIFO) : 對列--先進(jìn)先出
存值 : queue_obj.put( )
取值 : queue_obj.get( )
獲取隊(duì)列的大小 : queue_obj.qsize( )
判斷隊(duì)列是否滿 : queue_obj.full( )
判斷隊(duì)列是否為空 : queue_obj.empty()
# 注意 : 隊(duì)列是線程安全的,list,dict 是非線程安全的,使用的時(shí)候最好使用線程鎖
多線程
什么是多任務(wù):同時(shí)執(zhí)行多個(gè)任務(wù) 例如:同時(shí)打開微信,QQ,word秆吵,優(yōu)酷撵术,瀏覽器
同時(shí)執(zhí)行--并行
單核同時(shí)執(zhí)行的任務(wù)數(shù)量只有一個(gè),但是看上去像是在執(zhí)行多個(gè)任務(wù)森瘪,是 因?yàn)榍袚Q的間隔時(shí)間級短
多核cpu:同時(shí)可以執(zhí)行多個(gè)任務(wù)托启,假如任務(wù)量超過核心數(shù)肋殴,在某個(gè)核心下 任務(wù)會交替執(zhí)行
并發(fā)和并行的概念:
并發(fā):單核cpu同時(shí)執(zhí)行多個(gè)任務(wù),任務(wù)是同時(shí)發(fā)起的以故,但是并不是同時(shí)執(zhí)行蜗细,而是交替執(zhí)行
并行:任務(wù)數(shù)量小于或等于核心數(shù),這個(gè)時(shí)候每一個(gè)核心都在執(zhí)行任務(wù)怒详,任務(wù)是同時(shí)執(zhí)行的炉媒,
實(shí)現(xiàn)多任務(wù)的手段(方式):
1.多線程
2.多進(jìn)程
3.協(xié)程
線程之間的操作是無序的
一個(gè)線程下面有一個(gè)主線程
線程:相當(dāng)于打開一個(gè)瀏覽器
進(jìn)程:相當(dāng)于在瀏覽器里面打開多個(gè)窗口
啟動線程: thread.start()
添加join的目的:為了讓任務(wù)隊(duì)里中的所有請求都執(zhí)行完畢
線程鎖:threadlock = threading.Lock()
進(jìn)程池
導(dǎo)入 from multiprocessing import Pool
創(chuàng)建一個(gè)進(jìn)程池:pool = Pool()
pool.apply() 同步的方法,執(zhí)行效率比較低
apply_async 是一個(gè)異步方法,可以提高任務(wù)執(zhí)行的效率
func,對應(yīng)的任務(wù)的函數(shù)名稱
args=(),傳遞參數(shù)(元組)
kwds={}, 傳遞參數(shù)(字典)
callback=None,(執(zhí)行成功后的回調(diào))
error_callback=None,(執(zhí)行錯(cuò)誤之后的回調(diào))
關(guān)閉進(jìn)程池:pool.close
pool.join() :join 方法 讓進(jìn)程池中的任務(wù)執(zhí)行完畢后昆烁,回到主線程繼續(xù)執(zhí)行
pool.submit(): 向進(jìn)程池中添加任務(wù)
.add_done_callback():添加回調(diào)方法
pool.shutdown():執(zhí)行了join 方法
dataqueue.put() :向隊(duì)列中存值
while not dataqueue.empty():
print(dataqueue.get())
使用manage().Queue() 創(chuàng)建一個(gè)隊(duì)列吊骤,可以實(shí)現(xiàn)在進(jìn)程池的進(jìn)程中實(shí)現(xiàn)數(shù)據(jù)的共享(通訊)
q = Manger().Queue()
可迭代對象:能夠執(zhí)行遍歷循環(huán)的都可以稱為可迭代對象(可以使用 for i in 循環(huán))
迭代器一定是一個(gè)可迭代對象
可迭代對象不一定是一個(gè)迭代器
常見的可迭代對象:list,set,dict,str,tuple
判斷是否是可迭代對象的方法: isinstance print(isinstance(a,Iterable))
把可迭代對象轉(zhuǎn)換為一個(gè)迭代器:data_obj = iter(data)
生成器是一個(gè)特殊的迭代器,生成器一定是一個(gè)可迭代對象静尼,可以使用next方法取值
python 中實(shí)現(xiàn)生成器的兩種方式
第一種:利用tuple(元祖)實(shí)現(xiàn)生成器
第二種白粉;使用yield 實(shí)現(xiàn)生成器,一旦某個(gè)方法中出現(xiàn)了yield這個(gè)關(guān)鍵字,這個(gè)方法就不單單是一個(gè)方法了鼠渺,得到的就是一個(gè)生成器
異常處理模塊
創(chuàng)建一個(gè)瀏覽器驅(qū)動
導(dǎo)入 webdriver : from selenium import webdriver
創(chuàng)建一個(gè)瀏覽器驅(qū)動:driver = webdriver.Chrome(executable_path= '/home/tian/桌面/驅(qū)動/chromedriver' )
異常處理模塊:from selenium.common.exceptions import TimeoutException,NoSuchElementException,NoSuchFrameException
TimeoutError:超時(shí)
NoSuchElementException :沒有此節(jié)點(diǎn)
NoSuchFrameException:沒有iframe
切換到子頁面:driver.switch_to_frame('loginIframe')
在子頁面找按鈕鸭巴,然后模擬點(diǎn)擊:driver.find_element_by_id('switcher_plogin').click()
輸入賬號:driver.find_element_by_xpath('//input[@id="u"]').send_keys('464660217')
找到登錄按鈕,然后點(diǎn)擊:driver.find_element_by_xpath('//input[@id="login_button"]').click()
登錄之后可以獲取到cookies信息,保存本地,可以以后使用:print(driver.get_cookies())
負(fù)責(zé)循環(huán)等待:from selenium.webdriver.support.ui import WebDriverWait
以什么方式尋找節(jié)點(diǎn):from selenium.webdriver.common.by import By
添加條件模塊:from selenium.webdriver.support import expected_conditions as EC
顯示等待:同樣可以指定一個(gè)等待時(shí)間,不過更加靈活,可以指定一個(gè)最長等待時(shí)間如果在最長時(shí)間還沒找到節(jié)點(diǎn)則拋出異常,如果找到則立即返回節(jié)點(diǎn)信息
尋找節(jié)點(diǎn):element = WebDriverWait(driver,10).until(
#添加尋找節(jié)點(diǎn)的條件
EC.presence_of_element_located((By.ID,'anony-time'))
)
創(chuàng)建一個(gè)瀏覽器驅(qū)動:driver = webdriver.Chrome(executable_path= '/home/tian/桌面/驅(qū)動/chromedriver' )
找到輸框:driver.find_element_by_xpath('//input[@id="form_email"]').send_keys('18518753265')
構(gòu)建一個(gè)瀏覽器的驅(qū)動:driver = webdriver.Chrome(
executable_path='/home/ljh/桌面/driver/chromedriver'
)
driver.get('https://www.baidu.com/')
獲取a標(biāo)簽:a_action1 = driver.find_element_by_xpath('//div[@id="u1"]/a[3]')
將鼠標(biāo)移動到a標(biāo)簽上: ActionChains(driver).move_to_element(a_action1).perform()
單擊:ActionChains(driver).move_to_element(a_action).click(a_action).perform()
雙擊:ActionChains(driver).move_to_element(a_action).double_click(a_action).perform()
拖拽:a_action2 = driver.find_element_by_xpath('//div[@id="u1"]/a[5]')
ActionChains(driver).drag_and_drop(a_action1,a_action2).perform()
切換到系統(tǒng)的提示框:alter = driver.switch_to_alert()
執(zhí)行js代碼,重新打開一個(gè)窗口:js = 'window.open("https://www.douban.com/")'
driver.execute_script(js)
切換瀏覽器的窗口:driver.switch_to.window(driver.window_handles[0])
切換到子頁面iframe:frame = driver.switch_to_frame('loginIframe') driver.find_element_by_xpath()
將圖片轉(zhuǎn)換為灰度圖:image5 = image3.convert("L")
設(shè)置圖片的伐值:pointvalue = 150
.send_keys(key) 輸入關(guān)鍵字
.click():按鈕點(diǎn)擊