使用Scrapy爬取页面时遇OpenSSL._util导入错误,寻求解决方法
解决Python2.7 + pyOpenSSL 13.1的ImportError: No module named _util问题
我之前在Mac High Sierra上用Python2.7跑Scrapy的时候也碰到过一模一样的问题,折腾了好一阵才搞定,给你几个可行的方案试试:
- 方案一:重新指定OpenSSL路径安装pyOpenSSL
Mac自带的OpenSSL(实际是LibreSSL)版本可能和pyOpenSSL 13.1不兼容,虽然你已经执行了brew link openssl,但Python2.7在编译pyOpenSSL的C扩展模块时可能没正确识别到brew安装的openssl。你可以通过CFLAGS和LDFLAGS强制指定路径,重新安装pyOpenSSL:
# 获取brew openssl的安装前缀 OPENSSL_PREFIX=$(brew --prefix openssl) # 强制重新安装pyOpenSSL 13.1 CFLAGS="-I${OPENSSL_PREFIX}/include" LDFLAGS="-L${OPENSSL_PREFIX}/lib" pip install pyOpenSSL==13.1 --force-reinstall
- 方案二:用虚拟环境隔离系统依赖
系统Python的全局环境很容易因为各种包的版本冲突出问题,建议给Scrapy单独创建一个干净的虚拟环境:
# 先安装virtualenv pip install virtualenv # 创建基于Python2.7的虚拟环境 virtualenv -p python2.7 scrapy_env # 激活虚拟环境 source scrapy_env/bin/activate # 在干净环境里安装依赖 pip install pyOpenSSL==13.1 scrapy
激活环境后再启动爬虫,大概率能避开系统环境的干扰。
- 方案三:检查编译依赖是否完整
pyOpenSSL的_util是编译生成的C扩展模块,如果安装时编译失败就会缺失。你可以先确保Xcode命令行工具已安装:
xcode-select --install
完成安装后再重新执行方案一的安装命令,观察编译过程有没有报错。
- 方案四:确保brew link openssl完全生效
有时候brew link openssl会因为系统限制未成功,试试加上--force参数强制链接:
brew link openssl --force
执行时会出现警告提示,但在High Sierra下这个操作是安全的,能确保系统优先使用brew安装的openssl版本。
如果还是不行,你可以在重新安装时加上-v参数查看详细日志(比如pip install ... -v),看看编译阶段有没有具体的错误信息,这样更容易定位问题。
内容的提问来源于stack exchange,提问作者codeomnitrix
相关产品推荐
相关产品推荐

