這周幫同事做一個基于Selenium的Python小爬蟲骏啰,在CentOS下用webdriver.Chrome的--headless模式簿姨,給網(wǎng)頁發(fā)送鍵盤事件消息迄沫。網(wǎng)上這類的資料很多膘怕,實現(xiàn)起來并不難捞烟,但在執(zhí)行時赎瑰,還是碰到了兩個技術(shù)坑王悍,需要記錄一下。
第一個是:Queue.queue和threading.Lock()的配合使用問題餐曼,這個用法其實是多此一舉压储,因為本身Queue.queue線程安全的,不需要加鎖源譬,但抄了錯誤代碼集惋,既然用了就用吧,順便練練線程lock踩娘,沒想到代碼寫的不好刮刑,主線程入數(shù)據(jù)時簡單加鎖,代碼如下:
queueLock.acquire()
workQueue.put(data)
queueLock.release()
可是Queue.queue的聲明是:
workQueue = Queue.Queue(10)
這樣在工作線程處理較慢時养渴,隊列10個數(shù)量被加滿了为朋,但queueLock.acquire()執(zhí)行完就進入鎖區(qū),導(dǎo)致工作線程無法再鎖獲取數(shù)據(jù)進行消費厚脉。最后加了隊列長度判斷和sleep解決习寸,代碼如下:
while True:
? ? ? ? ? ? ? ? if workQueue.qsize() < 8 :
? ? ? ? ? ? ? ? ? ? queueLock.acquire()
? ? ? ? ? ? ? ? ? ? workQueue.put(data)
? ? ? ? ? ? ? ? ? ? queueLock.release()
? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ? ? sleep(1)
第二個是webdriver的路徑問題,現(xiàn)象是shell下直接執(zhí)行沒問題傻工,但用crontab定時任務(wù)就不行了霞溪,查了試了N多方法,最后確認是chromedriver的路徑問題中捆,修改代碼解決鸯匹。
driver = webdriver.Chrome(executable_path="/usr/local/bin/chromedriver",chrome_options=chrome_options)
記錄并備忘之。