这周帮同事做一个基于Selenium的Python小爬虫,在CentOS下用webdriver.Chrome的--headless模式,给网页发送键盘事件消息。网上这类的资料很多,实现起来并不难,但在执行时,还是碰到了两个技术坑,需要记录一下。
第一个是:Queue.queue和threading.Lock()的配合使用问题,这个用法其实是多此一举,因为本身Queue.queue线程安全的,不需要加锁,但抄了错误代码,既然用了就用吧,顺便练练线程lock,没想到代码写的不好,主线程入数据时简单加锁,代码如下:
queueLock.acquire()
workQueue.put(data)
queueLock.release()
可是Queue.queue的声明是:
workQueue = Queue.Queue(10)
这样在工作线程处理较慢时,队列10个数量被加满了,但queueLock.acquire()执行完就进入锁区,导致工作线程无法再锁获取数据进行消费。最后加了队列长度判断和sleep解决,代码如下:
while True:
if workQueue.qsize() < 8 :
queueLock.acquire()
workQueue.put(data)
queueLock.release()
break
else:
sleep(1)
第二个是webdriver的路径问题,现象是shell下直接执行没问题,但用crontab定时任务就不行了,查了试了N多方法,最后确认是chromedriver的路径问题,修改代码解决。
driver = webdriver.Chrome(executable_path="/usr/local/bin/chromedriver",chrome_options=chrome_options)
记录并备忘之。