参考内容:Python3 网络爬虫开发实战-崔庆才
我们直接用 requests,Selenium 等库写爬虫,如果爬取量不是太大,速度要求不高,是完全可以满足需求的。但是写多了会发现其内部许多代码和组件是可以复用的,如果我们把这些组件抽离出来,将各个功能模块化,就慢慢会形成一个框架雏形,久而久之,爬虫的框架就诞生了。
利用框架,我们可以不用再去关心某些功能的具体实现,只需要关心爬取逻辑即可。有了它们,可以大大简化代码量,而且架构也会变得清晰,爬取效率也会高许多。所以,如果有一定的基础,上手框架是一种好的选择。
pyspider 的安装
pyspider 是国人 binux 编写的强大的网络爬虫框架,它带有强大的 WebUI,脚本编辑器,任务监控器,项目管理器以及结果处理器,同时支持多种数据库后端,多种消息队列,另外还支持 JavaScript 渲染页面的爬取,使用起来非常方便。
相关链接
- 官方文档: http://docs.pyspider.org/en/latest/#pyspider
- PyPI: https://pypi.org/project/pyspider/
- GitHub: https://github.com/binux/pyspider
- 官方教程: http://docs.pyspider.org/en/latest/tutorial/
准备工作
pyspider 是支持 JavaScription 渲染的,而这个过程是依赖于 PhantomJS 的,所以需要安装 PhantomJS。
安装方法:
1 | pip install phantomjs |
安装方式
这里推荐使用 pip 安装,命令如下:
1 | pip install pyspider |
验证安装
安装完成之后,可以直接在命令行下启动 pyspider:
1 | pyspider all |
此时控制台会有如下所示的输出:
1 | % pyspider all |
这时 pyspider 的 Web 服务就会在本地的 5000 端口运行。直接在浏览器中打开 http://localhost:5000/,即可进入 pyspider 的 WebUI 管理页面,如下图所示,这证明 pyspider 已经安装成功。
排错相关
- 错误1: Python 3.7 中与 async 相关的错误,如下:
1
2
3
4
5
6File "/Users/wanwu/.pyenv/versions/3.7.5/envs/python-spider/lib/python3.7/site-packages/pyspider/run.py”, line 231
async=True, get_object=False, no_input=False):
SyntaxError: invalid syntax
File "/Users/wanwu/.pyenv/versions/3.7.5/envs/python-spider/lib/python3.7/site-packages/pyspider/fetcher/tornado_fetcher.py", line 81
def __init__(self, inqueue, outqueue, poolsize=100, proxy=None, async=True):
造成该错误的原因是 Python 3.7 中,async 无法再用做变量名。解决方法是编辑相应提示的文件,将 async 改成 shark。
- 错误2:wsgidav 版本不同造成的错误
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35Traceback (most recent call last):
File "/Users/wanwu/.pyenv/versions/python-spider/bin/pyspider", line 11, in <module>
load_entry_point('pyspider==0.3.10', 'console_scripts', 'pyspider')()
File "/Users/wanwu/.pyenv/versions/3.7.5/envs/python-spider/lib/python3.7/site-packages/pyspider/run.py", line 754, in main
cli()
File "/Users/wanwu/.pyenv/versions/3.7.5/envs/python-spider/lib/python3.7/site-packages/click/core.py", line 764, in __call__
return self.main(*args, **kwargs)
File "/Users/wanwu/.pyenv/versions/3.7.5/envs/python-spider/lib/python3.7/site-packages/click/core.py", line 717, in main
rv = self.invoke(ctx)
File "/Users/wanwu/.pyenv/versions/3.7.5/envs/python-spider/lib/python3.7/site-packages/click/core.py", line 1137, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/Users/wanwu/.pyenv/versions/3.7.5/envs/python-spider/lib/python3.7/site-packages/click/core.py", line 956, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/Users/wanwu/.pyenv/versions/3.7.5/envs/python-spider/lib/python3.7/site-packages/click/core.py", line 555, in invoke
return callback(*args, **kwargs)
File "/Users/wanwu/.pyenv/versions/3.7.5/envs/python-spider/lib/python3.7/site-packages/click/decorators.py", line 17, in new_func
return f(get_current_context(), *args, **kwargs)
File "/Users/wanwu/.pyenv/versions/3.7.5/envs/python-spider/lib/python3.7/site-packages/pyspider/run.py", line 497, in all
ctx.invoke(webui, **webui_config)
File "/Users/wanwu/.pyenv/versions/3.7.5/envs/python-spider/lib/python3.7/site-packages/click/core.py", line 555, in invoke
return callback(*args, **kwargs)
File "/Users/wanwu/.pyenv/versions/3.7.5/envs/python-spider/lib/python3.7/site-packages/click/decorators.py", line 17, in new_func
return f(get_current_context(), *args, **kwargs)
File "/Users/wanwu/.pyenv/versions/3.7.5/envs/python-spider/lib/python3.7/site-packages/pyspider/run.py", line 384, in webui
app.run(host=host, port=port)
File "/Users/wanwu/.pyenv/versions/3.7.5/envs/python-spider/lib/python3.7/site-packages/pyspider/webui/app.py", line 59, in run
from .webdav import dav_app
File "/Users/wanwu/.pyenv/versions/3.7.5/envs/python-spider/lib/python3.7/site-packages/pyspider/webui/webdav.py", line 216, in <module>
dav_app = WsgiDAVApp(config)
File "/Users/wanwu/.pyenv/versions/3.7.5/envs/python-spider/lib/python3.7/site-packages/wsgidav/wsgidav_app.py", line 134, in __init__
_check_config(config)
File "/Users/wanwu/.pyenv/versions/3.7.5/envs/python-spider/lib/python3.7/site-packages/wsgidav/wsgidav_app.py", line 118, in _check_config
raise ValueError("Invalid configuration:\n - " + "\n - ".join(errors))
ValueError: Invalid configuration:
- Deprecated option 'domaincontroller': use 'http_authenticator.domain_controller' instead.
报错原因是 wsgidav 发布的3.x版本目前仍然是测试版,相对于2.x(例如2.4.1)更改了一些用法,上面报错的两个部分就是的。pyspider的3.0及以上版本在安装时,会默认安装wsgidav的3.x版(具体的版本可能会有偏差)
解决办法
其实上面错误信息已经提示该如何改了,不过那样改比较麻烦。可以换个方法,换回wsgidav的2.x版本就不会报错了。先把3.x版卸载,再装2.x版。下面是具体的卸载安装的命令
1 | pip uninstall wsgidav |
- 错误3: 没有安装 werkzeug 依赖库造成的错误
1
2
3
4
5
6
7
8
9
10
11File "/Users/wanwu/.pyenv/versions/3.7.5/envs/python-spider/lib/python3.7/site-packages/pyspider/run.py", line 497, in all
ctx.invoke(webui, **webui_config)
File "/Users/wanwu/.pyenv/versions/3.7.5/envs/python-spider/lib/python3.7/site-packages/click/core.py", line 555, in invoke
return callback(*args, **kwargs)
File "/Users/wanwu/.pyenv/versions/3.7.5/envs/python-spider/lib/python3.7/site-packages/click/decorators.py", line 17, in new_func
return f(get_current_context(), *args, **kwargs)
File "/Users/wanwu/.pyenv/versions/3.7.5/envs/python-spider/lib/python3.7/site-packages/pyspider/run.py", line 384, in webui
app.run(host=host, port=port)
File "/Users/wanwu/.pyenv/versions/3.7.5/envs/python-spider/lib/python3.7/site-packages/pyspider/webui/app.py", line 64, in run
from werkzeug.wsgi import DispatcherMiddleware
ImportError: cannot import name 'DispatcherMiddleware' from 'werkzeug.wsgi' (/Users/wanwu/.pyenv/versions/3.7.5/envs/python-spider/lib/python3.7/site-packages/werkzeug/wsgi.py)
原因:
1、没有安装werkzeug
2、werkzeug的版本为1.0.0,这个版本中没有DispatcherMiddleware方法
解决办法:
卸载werkzeug,重新安装低版本的werkzeug
1 | pip install werkzeug |
Scrapy 的安装
Scrapy 是一个十分强大的爬虫框架,依赖的库比较多,至少需要依赖的库有 Twisted 14.0,lxml3.4 和 pyOpemSSL0.14。在不同的平台环境下,它依赖的库也各不相同,所以在安装之前,最好确保把一些基本的库安装好。
相关链接
- 官方网站: https://scrapy.org
- 官方文档: https://docs.scrapy.org/en/latest/
- PyPI: https://pypi.org/project/Scrapy
- GitHub: https://github.com/scrapy/scrapy
- 中文文档: https://scrapy-chs.readthedocs.io
安装方式
Anaconda 安装
这是一种比较简单的安装 Scrapy 的方法(尤其是对于 Windows来说),如果你的 Python 是使用 anaconda 安装的,或者还没有安装 Python 的话,可以使用此方法安装,这种方法简单,省力。当然,如果你的 Python 不是通过 anaconda 安装的,可以继续看后面的内容。
关于 Anaconda 的安装方式,自行百度。这里不再赘述。
如果已经安装好了 Anaconda,name可以通过 conda 命令安装 Scrapy,具体如下:
1 | conda install Scrapy |
Windows 下的安装
如果你的 Python 不是使用 Anaconda 安装的,可以参考如下方式来进行一步步安装 Scrapy。
安装 lxml
lxml 的安装过程请参见 Python 爬虫解析库的安装,此处不再赘述,此库非常重要,请一定要安装成功。安装 pyOpenSSL
在官方网站下载 wheel 文件(详见 https://pypi.org/project/pyOpenSSL/#files)即可。
下载后利用 pip 安装即可:1
pip install pyOpenSSL-19.1.0-py2.py3-none-any.whl
安装 Twisted
在官网下载 wheel 文件(详见 https://pypi.org/project/Twisted/#files),比如,对于 Python 3.6 版本,Windows 64 位系统,则当前最新的版本为 Twisted-19.10.0-cp36-cp36m-win_amd64.whl ,直接下载即可。
然后通过 pip 安装:1
pip install Twisted-19.10.0-cp36-cp36m-win_amd64.whl
安装 PyWin32
从官方网站下载对应版本的安装包即可(详见 https://pypi.org/project/pywin32/#files),比如对于 Python 3.6 版本,Windows 64 位系统,则当前最新的版本为 pywin32-227-cp36-cp36m-win_amd64.whl ,直接下载即可。
然后通过 pip 安装即可:1
pip install pywin32-227-cp36-cp36m-win_amd64.whl
安装 Scrapy
安装好了以上的依赖库后,安装 Scrapy 就非常简单了,这里依然使用 pip 命令,如下:1
pip install Scrapy
等待命令结束,如果没有报错,就证明 Scrapy 已经安装好了。
Linux 下的安装
- CentOS 和 Redhat
在 CentOS 和 RedHat 下,首先确保一些依赖库已经安装,运行如下命令:1
2sudo yum groupinstall -y development tools
sudo yum install -y epel-release libxslt-devel libxml2-devel openssl-devel
最后利用 pip 安装 Scrapy
1 | pip install Scrapy |
- Ubuntu, Debian 和 Deepin
在 Ubuntu,Debian 和 Deepin 平台下,首先确保一些依赖库已经安装,运行如下命令:1
sudo apt-get install build-essential python3-dev libssl-dev libffi-dev libxml2 libxml2-dev libxsltl-dev zliblg-dev
然后利用 pip 安装 Scrapy
1 | pip install Scrapy |
Mac 下的安装
在 Mac 下,首先也是进行依赖库的安装。
在 Mac 上构建 Scrapy 的依赖库需要 C 编译器以及开发头文件,它一般由 Xcode 提供,具体命令如下:
1 | xcode-select --install |
随后利用 pip 安装 Scrapy 即可:
1 | pip install Scrapy |
验证安装
安装完之后,在命令行下输入 scrapy,如果出现如下所示的结果,则证明 Scrapy 安装成功了:
1 | % scrapy |
Scrapy-Splash 的安装
Scrapy-Splash 是一个 Scrapy 中支持 JavaScript 渲染的工具。
Scrapy-Splash 的安装分为两部分。一个是 Splash 服务的安装,具体是通过 Docker,安装之后,会启动一个 Splash 服务,我们可以通过它的接口来实现 JavaScript 页面的加载。另一个是 Scrapy-Splash 的 Python 库 的安装,安装之后即可在 Scrapy 中使用 Splash 服务。
相关链接
- GitHub: https://github.com/scrapy-plugins/scrapy-splash
- PyPI: https://pypi.org/project/scrapy-splash/
- 使用说明:https://github.com/scrapy-plugins/scrapy-splash#configuration
- Splash 官方文档: http://splash.readthedocs.io
安装 Splash
Scrapy-Splash 会使用 Splash 的 HTTP API 进行页面渲染,所以我们需要安装 Splash 来提供渲染服务。这里通过 Docker 安装,在这之前清确保已经正确安装好了 Docker。
安装命令如下:
1 | docker run -p 8050:8050 scrapinghub/splash |
安装完成之后,会有类似如下的输出结果:
1 | 2020-03-07 14:48:23+0000 [-] Log opened. |
这就证明 Splash 已经在 8050 端口上运行了。这时我们打开 http://0.0.0.0:8050 即可看到 Splash 主页。
当然,Splash 也可以直接安装在远程服务器上。我们在服务器上以守护形态运行 Splash 即可,命令如下:
1 | docker run -d -p 8050:8050 scrapinghub/splash |
这里多了 -d 参数,它代表将 Docker 容器以守护形态运行,这样在中断远程服务器连接后,不会终止 Splash 服务的运行。
安装 Scrapy-Splash
成功安装 Splash 之后,接下来再安装其 Python 库,命令如下:
1 | pip install scrapy-splash |
命令运行完毕后,就会成功安装好此库。
Scrapy-Redis 的安装
Scrapy-Redis 是 Scrapy 的分布式扩展模块,有了它,我们可以方便的实现 Scrapy 分布式爬虫的搭建。
相关链接
- GitHub: https://github.com/rmax/scrapy-redis
- PyPI: https://pypi.org/project/scrapy-redis/
- 官方文档: http://scrapy-redis.readthedocs.io
安装方式
这李推荐使用 pip 安装,命令如下:
1 | pip install scrapy-redis |
验证安装
安装完成之后,可以在命令行下测试:
1 | python -c "import scrapy_redis" |