使用 pyspider 作为爬虫入门框架要比直接用 Scrapy 容易太多,如果你需要快速爬取一个网站,pyspider 爬虫框架是最佳选择之一
pyspider 框架具有以下优点
- 有 Web 界面用于开发爬虫,任务、项目管理,查看爬取结果
- 支持各种数据库(MySQL、MongoDB、SQLite 等)存储爬取结果
- 可以方便设置任务优先级,重新爬取策略
- 支持单机与分布式部署
- 支持 PhantomJS 爬取动态网页
本 Chat 从建立开发环境开始,然后开始实战爬取数据,需要具备以下能力:
- Python 编程能力
- 了解 HTML、CSS、JavaScript
- 了解 jQuery CSS Selector
学习完成本 Chat 以后,你可以:
- 搭建自己的爬虫开发环境
- 开发一些简单的爬虫
-
-
- 安装 pyspider
- 确认 Python 和 pip3 版本
- 设置 pip 镜像
- 安装 pipenv
- 使用 pipenv 建立虚拟开发环境
- 使用 pipenv 安装 pyspider
- 安装任务到此结束,运行一下 pyspider
- 第一个项目:gitbook.cn
- 项目目标
- 项目分析
- 项目实现步骤
- 拓展练习
- 总结
- 安装 pyspider
-
pyspider 是一个简单好用的爬虫框架,项目地址:https://github.com/binux/pyspider。
相对于 Scrapy 框架来说, pyspider 具有以下优点:
- 有 Web 界面用于开发爬虫,任务、项目管理,查看爬取结果;
- 支持各种数据库(MySQL、MongoDB、SQLite 等)存储爬取结果;
- 可以方便设置任务优先级,重新爬取策略;
- 支持单机与分布式部署;
- 支持 PhantomJS 爬取动态网页。
如果你需要快速爬取一个网站的数据,使用 pyspider 可以事半功倍。就如同设计产品需要先画一个草图一样,先用 pyspider 开发爬虫可以尽快体验项目中可能遇到的问题,开发完成以后,可以再迁移到更为高级的框架如 Scrapy。
如果没有 Python 开发环境,请先安装:
- Windows 10:安装 Anaconda Python 3
- Linux:
apt install python3 python3-pip
或者yum install -y python36 python36-pip
- macOS:
brew install python3
笔者不建议使用 Windows 学习 Python 开发,因为有无穷多的坑需要踩,各种问题层出不穷。强烈推荐安装一个 Linux 虚拟机来学习 Python 爬虫开发。
以下安装步骤使用 Ubuntu 18.04 测试通过,如果你实在坚持要用 Windows 环境,那只能表示佩服了。
下面我们来安装 pyspider,安装步骤:
- 安装 pipenv
- 使用 pipenv 安装 pyspider
- 完成安装
执行以下命令:
python3 --versionpip3 --version
笔者的环境:
Python 3.6.7pip 19.1.1
设置 pip 镜像
由于 pip 包的服务器比较慢,因此我们设置一下 pip 配置使用国内的镜像。
建立文件夹 .pip
mkdir ~/.pip
编辑文件 ~/.pip/pip.conf
[global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple
这里使用了清华的镜像,请根据自己的网络情况选择 pip 镜像服务器。参考:https://mirrors.tuna.tsinghua.edu.cn/help/pypi/。
安装 pipenv为什么要用 pipenv?
- 因为 pipenv 完美的结合了 pip 和 virtualenv;
- 从此无需担心开发库的安装路径,只需要直接执行
pip install
就会把开发库安装到虚拟环境中。
使用 --user
参数将把 pipenv 安装到 ~/.local 目录,不会影响系统 Python,也无需特殊权限。
执行以下命令:
pip3 install --user pipenv
使用 pipenv 建立虚拟开发环境
首先建立一个新目录 pyspider ,并进入这个目录。使用 pipenv 建立一个新的 Python 开发环境。
为什么要建立一个开发环境?
- 建立一个开发环境后,就可以在这个环境里安装各种开发库,而不会影响系统环境;
- 一旦环境损坏了,删除重新建立即可。
参数:
- --three:使用 python3 建立开发环境
- --site-packages:使用系统自带的库
pipenv shell
命令: 建立好开发环境后,进入这个开发环境的 shell ,从此告别系统 Python、pip。
执行以下命令:
mkdir pyspidercd pyspiderpipenv --three --site-packagespipenv shell
使用 pipenv 安装 pyspider
首先确认我们已经启用了 pipenv 的开发环境:
pipenv shell
安装指定版本的 pyspider==0.3.10 wsgidav==2.4.1。
本文写作的时候,2019 年 6 月, pyspider 在 pypi 发布的最新版本为 0.3.10。然而 pyspider 需要的包 wsgidav 最新版 3.0 有不兼容问题,因此我们指定安装 2.4.1 版来解决这一问题。
执行以下命令:
pip install pyspider==0.3.10 wsgidav==2.4.1
其他安装相关问题:
- 在安装 pyspider 的过程中,有时候需要编译 pycurl、pylxml 这两个包,还记得我们建立开发环境的时候指定过
--site-packages
参数? 对了,可以安装系统包来解决依赖问题。 - Linux:
apt install python3-pycurl python3-lxml
。 - 如果使用的是 Anaconda,那么试试
conda install pycurl
。
pyspider 依赖的所有开发包一览:
pyspider==0.3.10 - chardet [required: >=2.2, installed: 3.0.4] - click [required: >=3.3, installed: 7.0] - cssselect [required: >=0.9, installed: 1.0.3] - Flask [required: >=0.10, installed: 0.12.2] - Flask-Login [required: >=0.2.11, installed: ?] - Jinja2 [required: >=2.7, installed: 2.10] - lxml [required: Any, installed: ?] - pycurl [required: Any, installed: ?] - pyquery [required: Any, installed: ?] - requests [required: >=2.2, installed: 2.20.1] - six [required: >=1.5.0, installed: 1.11.0] - tblib [required: >=1.3.0, installed: 1.3.2] - tornado [required: >=3.2,=1.6, installed: 2.5.1] - wsgidav [required: >=2.0.0, installed: 2.4.1] - defusedxml [required: Any, installed: 0.6.0] - jsmin [required: Any, installed: 2.2.2] - PyYAML [required: Any, installed: ?]
以上使用 pipenv graph
命令生成,可以看到那些带了 ?
的包就是系统提供的,而有版本号的则是 pip 安装到开发环境中的。
执行以下命令:
pyspider
运行输出:
(pyspider) hkaimacpro:pyspider hkai$ pyspider[W 190610 11:54:56 run:413] phantomjs not found, continue running without it.[I 190610 11:54:59 result_worker:49] result_worker starting...[I 190610 11:54:59 processor:211] processor starting...[I 190610 11:54:59 tornado_fetcher:638] fetcher starting...[I 190610 11:54:59 scheduler:647] scheduler starting...[I 190610 11:54:59 scheduler:782] scheduler.xmlrpc listening on 127.0.0.1:23333[I 190610 11:54:59 scheduler:586] in 5m: new:0,success:0,retry:0,failed:0[I 190610 11:54:59 app:76] webui running on 0.0.0.0:5000
以后我们再安装 PhantomJS 无头浏览器,现在可以先忽略这个消息。在浏览器中打开 http://localhost:5000 就可以看到 pyspider 的控制面板:
让我们新建一个项目,爬取 gitbook.cn 首页 Chat 列表信息。
在控制面板中 Create 按钮,弹出以下界面,输入以下内容:
- Project Name : gitbook
- Start URL(s): https://gitbook.cn
pyspider 为我们生成了一些模板代码,如图:
这段模板代码已经可以做很多事情了,让我们来运行一下看看效果,请按照以下步骤执行一遍。
首先,在右侧点 save 按钮。
重要!重要!重要!略过这一步的可能造成整个项目消失不见! 笔者痛心疾首的建议多点 save 按钮。
在左侧部分,点 run 按钮。
pyspider 执行了 on_start 函数,并返回了一个结果。
- 在左侧部分的下方, 可以看到 follow 按钮有了个红色数字 1 ,表明 on_start 函数产生了一个需要跟随的请求
- 在左侧部分下方,点 follow 按钮,可以看到:
index_page > https://gitbook.cn/
on_start 函数产生了一个 request,将返回的 response 交给回调函数 index_page,如图:
点图中链接部分的绿色箭头按钮 >
,将会执行 index_page 函数,将返回的 response 解析一下,如图:
一下子过来了好多数据,我这次的执行结果是 63 个 follow,每次可能都不一样。为什么会过来这些数据,看代码和注释!
def index_page(self, response): # 对于 response.doc , 搜索所有 a 标签,取出其 href属性 # 并判断 href属性值以 http 开始,返回 items() 给 for 遍历 for each in response.doc('a[href^="http"]').items(): # 对每个 each, 调用 self.crawl 方法,传递了两个参数 # each.attr.href : url # 回调函数 detail_page self.crawl(each.attr.href, callback=self.detail_page)
response.doc 是 pyspider 自动创建的 pyquery 对象, 感兴趣的可以去官网学习一下:
https://pyquery.readthedocs.io/en/latest/
执行了模板代码,是不是对于 pyspider 充满了信心? 一行代码还没写就能做这些事情了。
项目目标刚才创建了项目,并执行了模板代码,体验了控制面板。现在说一下项目目标。
- 遍历 gitbook.cn 首页,获取 Chat 列表
- 获取每个 Chat 的以下数据:
- 分类,例如:编程语言、人工智能
- 标题,例如:Python 爬虫面试题 170 道:2019 版
- 链接,例如:https://gitbook.cn/gitchat/activity/5cf8ca61da0c2c41ee4697ff
- 简介
- 作者与作者简介
- 参加人数
- 作业
- 自己实现一遍,不要拷贝粘贴代码
index_page 中的代码没有用,先删掉。
使用浏览器开发工具分析网页,如图:
我们需要的数据都在一个个 div class="chat_item"
中,实现思路:
- 从 response.doc 解析一个个 chat_item
- 从每个 chat_item 解析出我们需要的数据
完成任务!
项目实现步骤修改 index_page 代码,先打印出来分类的文字内容:
def index_page(self, response): # 在response.doc 中, 搜索 .chat_item 并调用 items 方法交给 for 遍历 for each in response.doc('.chat_item').items(): # 打印出每个 chat_item 中 chat_category 的文字内容 print( each.find('.chat_category').text() ) ``` * 修改完成,注意保存: save * 在左侧,按照之前的步骤执行 run *  * 已经打印出来分类了,其他的数据也可以解析出来,并且存入文件或者数据库中 * 再次修改 index_page 代码,如下: ```python def index_page(self, response): # 在response.doc 中, 搜索 .chat_item 并调用 items 方法交给 for 遍历 for each in response.doc('.chat_item').items(): # 每个chat的链接在 chat_item 的父元素的父元素中 print( each.parent().parent().attr.href ) # 打印出每个 chat_item 中 相关信息 print( each.find('.chat_category').text() ) print( each.find('.chat_info_title').text() ) print( each.find('.chat_info_desc').text()[0:30] ) print( each.find('.chat_info_author').text() ) print( each.find('.chat_count').text())
再次执行 run,应该可以看到把我们需要的信息都解析出来了,保存到 CSV 文件请自己实现吧。
拓展练习首页的 Chat 列表仅仅显示了 20 个,如何获取更多 Chat?
这里 gitbook.cn 使用了 Ajax 调用,每当翻页到底部时,会触发一个请求到服务器,再返回 20 个 Chat。使用浏览器开发工具的网络调试可以看到这一请求的 URL。
Chat 详情页面有更多内容,如何请求并解析详情页面?
在 index_page 中我们已经得到了 Chat 的 URL,例如:https://gitbook.cn/gitchat/activity/5cf8ca61da0c2c41ee4697ff。
调用 self.crawl 方法,指定回调函数 detail_page,就会请求详情页面,然后在 detail_page 中继续解析就可以了。
这个项目太容易了,有没有困难点的?
有,毕竟这个 Chat 是 爬虫入门,我们只是小小地尝试了 pyspider 的最基本功能,请等待笔者的下一个 Chat。
总结安装 pyspider 注意:pyspider 需要的包 wsgidav 最新版 3.0 有不兼容问题,因此我们指定安装 2.4.1 版来解决这一问题。
开发第一个爬虫项目和拓展练习看着很容易,自己开发一遍才能真正学会,请大家自己体会吧。
本文首发于 GitChat,未经授权不得转载,转载需与 GitChat 联系。
阅读全文: http://gitbook.cn/gitchat/activity/5cea146398a16d674504c9d5
您还可以下载 CSDN 旗下精品原创内容社区 GitChat App ,阅读更多 GitChat 专享技术内容哦。