1、使用环境 ubuntu16.04,python3.5
2、官方文档
https://selenium-python-zh.readthedocs.io/en/latest/installation.html
3、安装
pip install selenium
4、ERROR1 chromedriver:
WebDriverException: Message: 'chromedriver' executable needs to be in PATH.
1) 解决:下载chromedriver,并将之复制到usr/bin目录下
chromedriver下载地址:https://sites.google.com/a/chromium.org/chromedriver/downloads
2) 从其他文件夹复制到root目录:$sudo copy chromedriver /usr/bin
然后输入密码,完成复制
5、ERROR2 权限:
Message: 'chromedriver' executable may have wrong permissions.
在usr/bin目录下修改chromedriver权限:$sodu chmod 777 chromedriver
6、ERROR3 session :
selenium.common.exceptions.SessionNotCreatedException: Message: session not created exception
要么更新chrome,要么重新降低chromedriver的版本
浏览器中帮助-关于google Chrome可以看到谷歌的版本
上面chromedriver下载地址里面有chromedriver与chrom的版本匹配情况
然后你会发现,下载地址里面除了最新版本以外其他的都是文本状态并不能点击链接
打开可以链接的最新版本下载地址,然后再网址栏中直接修改上图红框部位的内容为你需要的版本,
回车,就可以打开你需要的版本地址了。
7、ERROR4 来自url地址的错误 :
错误说明:我发现了一个特别的url地址:http://wsnj.xags.gov.cn/webgs/erwmcx/index.jsp?ID=6101040000332375
这个地址,我直接在浏览器里面打开是打不开的,但是在我的数据里面有不少类似的url地址混在其中,从表面看这条url地址与其他的地址并无多少差别,所以我无法从字符串中粗暴的判断出区别。
所以我照常的将这条地址输入了 drive.get(url) 企图在打开过程中进行判断。在打开过程中,页面耗时非常久最终返回读取失败的页面。
针对这种情况,当然是拖慢进度的,需要改进的。最好的方法是给定限时,所以我进行了一些限时方法
**********
方法1:显式等待判断:限时判断代码中是否出现div块,【1】
driver = webdriver.Chrome()
t1=time.time()
driver.implicitly_wait(10)
driver.get('http://wsnj.xags.gov.cn/webgs/erwmcx/index.jsp?ID=6101040000332375')
# locator = (By.LINK_TEXT, 'CSDN')
try:
WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located((By.XPATH,".//*[div]")))
t2=time.time()
print(t2-t1)
finally:
driver.close()
结果:失败,页面请求时间是189秒
*************
方法2:隐式等待判断:限时等待判断页面是否加载完成【1】
driver = webdriver.Chrome()
driver.implicitly_wait(5) # 隐性等待,最长等30秒
t1=time.time()
driver.get('http://wsnj.xags.gov.cn/webgs/erwmcx/index.jsp?ID=6101040000332375')
t2=time.time()
print(t2-t1)
print(driver.current_url)
driver.quit()
结果:失败,页面请求结束的时间是189秒
*************
方法3:函数限时调用
import timeout_decorator
@timeout_decorator.timeout(5)
def mytest(drive,url):
print('bef')
driver.get(url)
print('aft')
return 5
t1=time.time()
try:
i=mytest(driver,url)
except:
i=0
t2=time.time()
if i>0:
pageSource = driver.page_source
print(t2-t1)
print(i)
print(len(pageSource))
print('****************************')
结果:可以在url请求这一步限时并返回
但是再一次请求的url的时候,由于上一个url请求还卡着,所以新的请求会失败。
并且在url请求卡住的期间,所有的drive调用也将被卡住,直到url求情返回失败信息,也就是如上的180秒以后。
所以需要在发现请求超时的时候强制关闭并重启浏览器,或者说新建一个drive。drive.quit()和drive.close()无法用于本次关闭需求。
方法4:这是需求转移之后,对方法三的补充,进行drive的强制关闭并重启
参考
【1】https://huilansame.github.io/huilansame.github.io/archivers/sleep-implicitlywait-wait