这是我近期学习的一些内容,可能不仅仅局限于scrapy爬虫框架,还会有很多知识的扩展。写的可能不是那么有条理,想到什么就写什么吧,毕竟也是自己以后深入学习的基础,有些知识说的不够明白欢迎留言,共同学习!
一、框架详解

Scrapy是由Twisted写的一个受欢迎的python事件驱动网络框架,它使用的是非阻塞的异步处理。
1.内部各组件的作用
ScrapyEngine(scrapy引擎):是用来控制整个系统的数据处理流程,并进行事务处理的触发。
Scheduler(调度器):用来接收引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回。它就像是一个URL的优先队列,由它来决定下一个要抓取的网址是什么,同时在这里会去除重复的网址。
Downloader(下载器):用于下载网页内容,并将网页内容返回给爬虫(Spiders)(Scrapy下载器是建立在Twisted这个高效的异步模型上的)。
Spiders(爬虫):爬虫主要是干活的,用于从特定网页中提取自己需要的信息,即所谓的实体(Item)。也可以从中提取URL,让scrapy继续爬取下一个页面。
Pipeline(项目管道):负责处理爬虫从网页中爬取的实体,主要的功能就是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被送到项目管道,并经过几个特定的次序处理数据。
Downloader Middlewares(下载器中间件):位于scrapy引擎和下载器之间的框架,主要是处理scrapy引擎与下载器之间的请求及响应。设置代理ip和用户代理可以在这里设置。
Spider Middlewares(爬虫中间件):位于scrapy引擎和爬虫之间的框架,主要工作是处理爬虫的响应输入和请求输出。
Scheduler Middlewares(调度中间件):位于scrapy引擎和调度器之间的框架,主要是处理从scrapy引擎发送到调度器的请求和响应。
2.Scrapy运行流程
引擎从调度器中取出一个URL用于接下来的抓取
引擎把URL封装成一个请求(Request)传给下载器
下载器把资源下载下来,并封装成一个响应(Response)
爬虫解析Response
解析出的是实体(Item),则交给项目管道(Pipeline)进行进一步的处理
解析出的是链接(URL),则把URL交给调度器等待下一步的抓取
二、为什么使用scrapy?爬虫能做什么?
1.Scrapy vs requests+beautifulsoup
首先,requests和beautifulsoup都是库,scrapy是框架;在scrapy框架中可以加入requests和beautifulsoup,它是基于Twisted(异步非阻塞)实现的,性能上有很大的优势;scrapy方便扩展,提供了很多内置的功能;它内置的css和Xpath以及selector提取数据的时候非常高效,beautifulsoup最大的缺点就是慢。
2.爬虫能做什么?
搜索引擎(如百度、Google)、推荐引擎(如今日头条)、机器学习的数据样本、数据分析(如金融数据分析)、舆情分析等
三、爬虫基础知识
1.正则表达式
为什么使用正则表达式?
有时候,我们爬取一些网页具体内容时,会发现我们只需要这个网页某个标签的一部分内容,或者这个标签的某个属性的值时,用xpath和css不太好提取数据,这时候我们就需要用到正则表达式去匹配提取。
re模块简介
re模块常用的一些正则元字符
元字符
re模块深入
JavaScript正则表达式
状态码2.深度优先和广度优先遍历算法
深度优先搜索(DepthFirstSearch):深度优先搜索的主要特征就是,假设一个顶点有不少相邻顶点,当我们搜索到该顶点,我们对于它的相邻顶点并不是现在就对所有都进行搜索,而是对一个顶点继续往后搜索,直到某个顶点,它周围相邻顶点都已经被访问过了,这时它就可以返回,对它原来的那个顶点的其余顶点进行搜索。深度优先搜索的实现可以利用递归很简单的实现。
广度优点搜索(BreadthFirstSearch):广度优先搜索相对于深度优先搜索侧重点不一样,深度优先好比一个人走迷宫,一次只能选定一条路走下去,而广度优先搜索好比是一次能有任意多个人,一次就走到和一个顶点相连的所有未访问过的顶点,然后再从这些顶点出发,继续这个过程。
3.url常见的去重策略
将访问过的url保存到数据库中
将访问过的url保存到set中,只需要o(1)的代价就可以查询url
url经过MD5等方法哈希后保存到set中
用bitmap方法,将访问过的url通过hash函数映射到某一位
bloomfilter方法对bitmap进行改进,多重hash函数降低冲突
4.爬虫与反爬虫
基本概念:
爬虫:自动获取网站数据的程序,关键是批量的获取
反爬虫:使用技术手段防止爬虫程序的方法
误伤:反爬虫技术将普通用户识别为爬虫,如果误伤过高,效果再好也不能用
成本:反爬虫需要的人力和机器成本
拦截:成功拦截爬虫,一般拦截率越高,误伤率越高
