您当前的位置: 首页 >  ide

爬虫开发入门:使用 Pyspider 框架开发爬虫

蔚1 发布时间:2019-05-28 23:30:05 ,浏览量:2

使用 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
        • 项目目标
        • 项目分析
        • 项目实现步骤
        • 拓展练习
      • 总结

dashboard.png

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
  • 完成安装
安装 pyspider 确认 Python 和 pip3 版本

执行以下命令:

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

运行输出:

(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 的控制面板:

dashboard.png

第一个项目:gitbook.cn

让我们新建一个项目,爬取 gitbook.cn 首页 Chat 列表信息。

在控制面板中 Create 按钮,弹出以下界面,输入以下内容:

  • Project Name : gitbook
  • Start URL(s): https://gitbook.cn

pyspider-create-new-project.png

pyspider 为我们生成了一些模板代码,如图:

pyspider-new-project.png

这段模板代码已经可以做很多事情了,让我们来运行一下看看效果,请按照以下步骤执行一遍。

首先,在右侧点 save 按钮。

重要!重要!重要!略过这一步的可能造成整个项目消失不见! 笔者痛心疾首的建议多点 save 按钮。

在左侧部分,点 run 按钮。

pyspider 执行了 on_start 函数,并返回了一个结果。

  • 在左侧部分的下方, 可以看到 follow 按钮有了个红色数字 1 ,表明 on_start 函数产生了一个需要跟随的请求
  • 在左侧部分下方,点 follow 按钮,可以看到:
index_page > https://gitbook.cn/

on_start 函数产生了一个 request,将返回的 response 交给回调函数 index_page,如图:

pyspider-index_page.png

点图中链接部分的绿色箭头按钮 >,将会执行 index_page 函数,将返回的 response 解析一下,如图:

pyspider-index_page-2.png

一下子过来了好多数据,我这次的执行结果是 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 中的代码没有用,先删掉。

使用浏览器开发工具分析网页,如图:

pyspider-analysis-gitbook.png

我们需要的数据都在一个个 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    * ![](https://images.gitbook.cn/2f5f5820-8b46-11e9-abd4-3359f30b3591)    * 已经打印出来分类了,其他的数据也可以解析出来,并且存入文件或者数据库中    * 再次修改 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 专享技术内容哦。

FtooAtPSkEJwnW-9xkCLqSTRpBKX

关注
打赏
1688896170
查看更多评论

蔚1

暂无认证

  • 2浏览

    0关注

    4645博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.1011s