告知
本系列笔记兼教程,来自慕课网“_bobby”的《聚焦Python分布式爬虫鼻血框架Scrapy 打造搜索引擎》。
主要是记录自己的学习过程,分享学习心得,做点笔记,以便自己日后在巩固,如有侵权,请联系我删除。
开发环境一览
1 | OS:Windows |
搭建开发环境
Pycharm
安装Pycharm的话,可以直接去官网下载安装社区版本(Community)即可,传送门。
MySQL
安装MySQL的话,也是去官网上下载,传送门。
记得点下面一个,体积大的,一次性全部下完。
还有安装的时候一定要记住用户名和密码。
送上一个Windows安装教程。
Navicat
这个没什么好说的,也是去官网上下载,然后百度破解。
Python
Python安装,还是从官网上下载。不过推荐可以用Anaconda安装。可以用清华镜像源下载,附送传送门。我选择的是3-4.2.0
版本,附带的是Python3.5
。
用Anaconda的好处就是会附带给你安装很多常用的Pyhon包,然后也易于包的管理。
配置虚拟环境
对于多Python版本,需要配置一下虚拟环境。可是对于我这种不用的小白,还是不整了吧。
基础知识
技术选型
Scrapy VS requests+beautifulsoup
- 后者都是库,而前者是框架
- 框架之中是可以用上一些库的
- Scrapy框架是基于twisted的,是一个异步库,性能是最大的优势。
- Scrapy方便易拓展,提供了很多内置的功能。
- Scrapy内置了css和xpath selector,而beautifulsoup速度很慢。
网页分类
常见类型的服务
- 静态网页(无数据库,不变)
- 动态网页(有数据库,可变)
- webservice(restapi)
我这个博客就是静态网页。
正则表达式
推荐一个教程。
深度优先和广度优先算法
网站在设计URL的时候,都是有层次的设计,是一种树形结构。这种结构让我们爬取网站更有策略。
(本文所有图片取自上述视频)
上图就是网页链接的一个结构图。可以看得出来网页里面的链接会在整个站点里面形成一个URL循环,所以要做去重。
深度优先
深度优先就是先纵向,再横向。
以上图为例,就是先A->B->D->E->I->C->F->G->H。(递归实现)
伪代码:
广度优先
广度优先就是先横向,再纵向。
还是以刚刚的图为例,就是A->B->C->D->E->F->G->H->I。(队列实现)
伪代码:
去重策略
- 访问过的URL存到数据库(效率很低,应用简单)。
- 将URL保存在set内存中,但是很费内存。
- URL经过md5等方法哈希以后保存到set中,不会重复(Scrapy中自带的方法)。
- 用bitmap方法,将访问过得URL通过hash函数映射到某一位,可能会有冲突。
- 用bloomfilter方法对bitmap进行改进,多重hash函数降低冲突(推荐使用方法,一亿个URL大概12M)。
字符串编码
发展史:
- 计算机智能处理数字,所有的东西都会转为01,。计算机中8个bit为一个字节,一个字节最大的数就是255。
- 计算机是美国人发明的,所以ASCII编码是美国的标准编码。
- 中文用ASCII处理中文明显不够,所以中国自己定义了一个GB2312编码,两个字节一个汉字。也把ASCII包含了进去。同理韩文日文巴拉巴拉。
- unicode出现了,将所有语言统一到一个编码里面。
- 乱码解决了,但如果内容全英文,unicode比ASCII需多一倍的空间。
- utf-8出现了,可变长的编码,把英文变成一个字节,汉字三个字节,特别生僻的是4-6个字节。
utf-8其实适用于文件的存储和传输,不利于处理。
上图为常见的读文件、处理文件和保存文件的一个编码转换过程。
Python中encode的时候,一定要保证前面的是unicode。而decode是将一个编码转换成unicode,使用的时候指明原来的是什么编码。
后记
到这里,爬虫的基础就已经讲完了,接下来是具体的用Scrapy进行自己的爬虫搭建。