Python爬虫学习笔记兼教程(一)

告知

本系列笔记兼教程,来自慕课网“_bobby”的《聚焦Python分布式爬虫鼻血框架Scrapy 打造搜索引擎》。

主要是记录自己的学习过程,分享学习心得,做点笔记,以便自己日后在巩固,如有侵权,请联系我删除。


开发环境一览

1
2
3
4
OS:Windows
IDE: Pycharm
数据库:mysql, redis, elasticsearch
开发环境:virtualenv

搭建开发环境

Pycharm

安装Pycharm的话,可以直接去官网下载安装社区版本(Community)即可,传送门

MySQL

安装MySQL的话,也是去官网上下载,传送门

记得点下面一个,体积大的,一次性全部下完。
还有安装的时候一定要记住用户名和密码。

送上一个Windows安装教程

这个没什么好说的,也是去官网上下载,然后百度破解。

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进行自己的爬虫搭建。