简易分布式爬虫系统的实现 | 青训营笔记

378 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第5天

1. 环境配置

1.1 主从机爬虫部分

请参考上一篇笔记内容:

简易分布式爬虫的分布式环境搭建 | 青训营笔记

1.2 前后端交互

前端

  • Jinja2
  • Echarts

后端

数据库

  • MongoDB
  • Redis

Python所需包

  • flask
  • pymongo
  • redis

1.3 IP代理池

参考:Github开源项目proxy_pool进行配置。

2. 整体流程

关于主机和从机的爬虫程序部分在上一篇笔记简易分布式爬虫的分布式环境搭建 | 青训营笔记中已有介绍。

从机爬取、解析后的数据会暂存在主机Redis数据库中,主机运行程序同步从Redis取出数据,并存储到MongoDB数据库中。

后端程序通过Flask操作MongoDB数据库,将数据传递到前端展示。

整体的流程图如下图所示。

项目框架.png

3. 爬取数据解析

XPath是一门在XML文档中查找信息的语言。XPath可用来在XML文档中对元素和属性进行遍历。XPath是W3C XSLT标准的主要元素,并且XQuery和XPointer都构建于XPath表达之上。

借助XPath可以快速定位需要提取的信息。

在浏览器中安装XPath Helper可以在网页中实时调试XPath提取的信息。

3.1 XPath安装

pip install lxml

3.2 XPath节点的关系

  • 父(Parent)
  • 子(Children)
  • 同胞(Sibling)
  • 先辈(Ancestor)
  • 后代(Descendant)

3.3 XPath选取节点

表达式描述
nodename选取此节点的所有子节点
/从根节点选取
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
.选取当前节点
..选取当前节点的父节点
@选取属性

3.4 通配符

XPath 通配符可用来选取未知的 XML 元素。

通配符描述举例结果
*匹配任何元素节点xpath('div/*')获取div下的所有子节点
@*匹配任何属性节点xpath('div[@*]')选取所有带属性的div节点
node()匹配任何类型的节点

4. 爬取数据的存储

主机端运行Python程序操作Redis数据库,从Redis中取出从机放入的解析数据(存取程序可以同步执行,可以实现一边存一边取),然后存入mongo数据库。

4.1 Redis操作

参考:Python操作redis详解

4.2 pymongo操作

参考:pymongo操作

5. 总结

通过对简易分布式爬虫系统的实现,从中学到了分布式爬虫框架Scrapy-Redis的使用、数据解析工具XPath的使用、前后端操作和数据可视化等。本次实现的项目虽然功能比较简陋,但是已经具备分布式逻辑和前后端操作的整体框架,为后续复杂项目的开发奠定了基础。

项目地址:

github.com/CoderDon/Cr…