Appearance
《精通Scrapy网络爬虫》阅读笔记
写在前面
- 书籍介绍:暂无。
- 我的简评:暂无。
- !!福利:文末有书籍地址、笔记思维导图、相关资料下载地址哦
第1章 初识Scrapy
1、网络爬虫是什么
网络爬虫是指在互联网上自动爬取网站内容信息的程序,也被称为网络蜘蛛或网络机器人
大型的爬虫程序广泛应用于搜索引擎、数据挖掘等领域,个人用户或企业也可以利用爬虫收集对自身有价值的数据
一个网络爬虫程序的基本执行流程可以总结为以下循环:下载页面;提取页面中的数据;提取页面中的链接
设计爬虫程序时,还要考虑防止重复爬取相同页面(URL去重)、网页搜索策略(深度优先或广度优先等)、爬虫访问边界限定等一系列问题
2、Scrapy简介及安装
- Scrapy简单易用、灵活易拓展、开发社区活跃,并且是跨平台的
3、编写第一个Scrapy爬虫
第2章 编写Spider
1、Scrapy框架结构及工作原理
Scrapy框架中的各个组件:ENGINE引擎,框架的核心,其他所有组件在其控制下协同工作;SCHEDULER调度器,负责对SPIDER提交的下载请求进行调度;DOWNLOADER下载器,负责下载页面(发送HTTP请求/接收HTTP响应);SPIDER爬虫,负责提取页面中的数据,并产生对新页面的下载请求;MIDDELWARE中间件,负责对Request对象和Response对象进行处理;ITEM PIPELINE数据管道,负责对爬取到的数据进行处理
框架数据流中的3个对象:REQUEST(Scrapy中的HTTP请求对象)、RESPONSE(Scrapy中的HTTP响应对象)、ITEM(从页面中爬取的一项数据)
2、Request和Response对象
Request对象用来描述一个HTTP请求。可以根据需求访问Request对象的属性,常用的几个:url、method、headers、body、meta
Response对象描述一个HTTP响应,Response只是基类,根据响应内容的不同有如下子类:TextResponse、HtmlRespnse、XmlResponse。
HtmlResponse对象有很多属性,最常用的3个方法:xpath、css、urljoin
3、Spider开发流程
Spider基类实现了以下内容:供Scrapy引擎调用的接口;供用户使用的实用工具函数;供用户访问的属性;
实现一个Spider只需要完成下面4个步骤:继承scrapy.Spider、为Spider取名、设定起始爬取点、实现页面解析函数
爬虫设定起始爬取点的两种方式:定义start_urls属性、实现start_request方法
页面解析函数是实现Spider中最核心的部分需要完成以下两项工作:使用选择器提取页面中的数据,将数据封装后提交给Scrapy引擎;使用选择器或LinkExtractor提取页面中的链接,用其构造新的Request对象并提交给Scrapy引擎
第3章 使用Selector提取数据
1、Selector对象
Python中常用以下模块处理文本解析:BeautifulSoup、lxml
Selector类的实现位于scrapy.selector模块
调用Selector对象的xpath方法或css方法可以选中文档中的某个或某些部分
调用Selector或SelectorLis对象的以下方法可将选中的内容提取:extract()、re()、extract_first()、re_first()
2、Response内置Selector
几乎不需要手动创建Selector对象,Response对象内部会以自身为参数自动创建Selector对象,并将该Selector对象缓存
Response对象还提供了xpath和css方法
3、XPath
XPath即XML路径语言,是一种用来确定xml文档中某部分位置的语言
XPath还提供许多函数,如数字、字符串、时间、日期、统计等
4、CSS选择器
CSS即层叠样式表,其选择器是一种用来确定HTML文档中某部分位置的语言
当我们调用Selector对象的CSS方法时,在其内部会使用Python库cssselect将CSS选择器表达式翻译成XPath表达式,然后调用Selector对象的XPATH方法
第4章 使用Item 封装数据
1、Item和Field
- Scrapy提供以下两个类,用户可以使用它们自定义数据类,封装爬取到的数据
2、拓展Item子类
3、Field元数据
- 一项数据由Spider提交给Scrapy引擎后,可能会被递送给其他组件(Item Pipeline、Exporter)处理
第5章 使用Item Pipeline处理数据
1、Item Pipeline
在Scrapy中,Item Pipeline是处理数据的组件,一个Item Pipeline就是一个包含特定接口上的类,通常只负责一种功能的数据处理,在一个项目中可以同时启用多个Item Pipeline,他们按指定次序级联起来,形成一条数据处理流水线
Item Pipeline的几种典型应用:清洗数据、验证数据的有效性、过滤掉重复的数据、将数据存入数据库
process_item方法是Item Pipeline的核心
还有3个比较常用的方法,可根据需求选择实现:open_spider(通常用于在开始处理数据之前完成某些初始化工作);close_spider(通常用于在处理完所有数据之后完成某些清理工作);from_crawer(通过crawler.settings读取配置,根据配置创建Item Pipeline对象)
2、更多例子
过滤重复数据
将数据存入MongoDB
第6章 使用LinkExtractor提取链接
1、使用LinkExtractor
提取链接有使用Selector和使用LinkExtractor两种方法
Scrapy提供了一个专门用于提取链接的类LinkExtractor,在提取大量链接或提取规则比较复杂时,使用LinkExtractor更加方便
2、描述提取规则
LinkExtractor构造器的所有参数都有默认值,如果构造对象时不传递任何参数(使用默认值),就提取页面中的所有链接
allow提取绝对url与正则表达式匹配的链接,deny相反;allow_domains提取指定域名的链接,deny_domains相反;restrict_xpaths提取XPath表达式选中区域下的链接;restrcit_css提取CSS选择器选中区域下的链接;tags提取指定标签内的链接;attrs提取指定属性内的链接;process_value接收一个回调函数
第7章 使用Exporter导出数据
1、指定如何导出数据
负责导出数据的组件被称为Exporter(导出器),Scrapy内部实现了多个Exporter,每个Exporter实现一种数据格式的导出,支持的数据格式如下:JSON、JSON lines、CSV、XML、Pickle、Marshal
导出数据时,需向Scrapy提供以下信息:导出文件路径、导出数据格式
可以通过以下两种方式指定爬虫如何导出数据:命令行参数指定、配置文件指定
2、添加导出数据格式
- BaseItemExporter定义了一些抽象接口待子类实现
第8章 项目练习
1、项目需求
2、页面分析
3、编码实现
第9章 下载文件和图片
1、FilesPipeline和ImagesPipeline
Scrapy框架内部提供了两个Item Pipeline,专门用于下载文件和图片:FilesPipeline、ImagesPipeline
下载结果信息包括以下内容:path文件下载到本地的路径、checksum文件的校验和、url文件的地址
2、项目实战:爬取matplotlib
- matplotlib是一个非常著名的Python绘图库,广泛应用于科学计算和数据分析等领域
3、项目实战:下载360图片
第10章 模拟登录
1、登录实质
响应头部中长长的Set-Cookie字段就是网站服务器程序保存在客户端(浏览器)的cookie信息,其中包含标识用户身份的session信息,之后对该网站发送的其他HTTP请求都会带上这个身份证(session)信息,服务器程序通过这个身份证识别出发送请求的用户,从而决定响应怎样的页面
其核心是向服务器发送含有表单数据的HTTP请求(通常是POST)
2、Scrapy模拟登录
- Scrapy提供了一个FormRequest类(Request的子类),专门用于构造含有表单数据的请求,FormRequest的构造器方法有一个formdata参数,接收字典形式的表单数据
3、识别验证码
OCR是光学字符识别的缩写,用于在图像中提取文本信息,tesseract是利用该技术实现的一个验证码识别库,在Python中可以通过第三方库pytesseract调用它
有些付费平台提供了HTTP服务接口,用户可以通过HTTP请求将验证码图片发送给平台,平台识别后将结果通过HTTP响应返回
人工识别验证码也是可行的,其实现也非常简单:在Scrapy下载完验证码图片后,调用Image.show方法将图片显示出来,然后调用Python内置的input函数,等待用户肉眼识别后输入识别结果
4、Cookie登录
不用管各种浏览器将Cookie以哪种形式存储在哪里,使用第三方Python库browsercookie便可以获取Chrome和Firefox浏览器中的Cookie
Scrapy爬虫所使用的Cookie由内置下载中间件CookiesMiddleware自动处理
BrowserCookiesMiddleware的实现核心思想是:在构造BrowserCookiesMiddleware对象时,使用browsercookie将浏览器中的Cookie提取,存储到CookieJar字典self.jars中
第11章 爬取动态页面
1、Splash渲染引擎
Splash是Scrapy官方推荐的JavaScript渲染引擎,他是使用Webkit开发的轻量级无界面浏览器,提供基于HTTP接口的JavaScript渲染服务
它支持的功能有:为用户返回经过渲染的HTML页面或页面截图;并发渲染多个页面;关闭图片加载,加速渲染;在页面中执行用户自定义的JavaScript代码;执行用户自定义的渲染脚本(lua),功能类似于PhantomJS
JavaScript页面渲染服务是Splash中最基础的服务
可以将execute端点的服务看作一个可用lua语言编程的浏览器,功能类似于PhantomJS
splash对象常用的属性和方法:args、js_enabled、images_enabled、go、wait、evaljs、runjs、url、html、get_cookies
2、在Scrapy中使用Splash
python库中scrapy-splash是非常好的选择
SplashRequest构造器方法中德一些常用参数:url、headers、cookies、args、cache_args、endpoint、splash_url
3、项目实战:爬取toscrape中的名人名言
4、项目实战:爬取京东商城中德书籍信息
第12章 存入数据库
1、SQLite
SQLite是一个文件型轻量级数据库,处理速度非常快,在数据量不是很大的情况下,使用SQLite就够了
在Python中访问SQLite数据库可使用Python标准库中的sqlite3模块
2、MySQL
MySQL是一个应用及其广泛的关系型数据库,它是开源免费的,可以支持大型数据库,在个人用户和中小企业中成为技术首选
在Python2中访问MySQL数据库可以使用第三方库MySQL-Python,在Python3中可以使用另一个第三方库mysqlclient作为替代
Scrapy框架自身是使用另一个Python框架爱=Twisted编写的程序,Twisted是一个事件驱动型的异步网络框架,鼓励用户编写异步代码
Twisted中提供了以异步方式多线程访问数据库的模块adbapi,使用该模块可以显著提高程序访问数据库的效率
3、MongoDB
MongoDB是一个面向文档的非关系型数据库(NoSQL),它功能强大、灵活、易于扩展
在Python中可以使用第三方库pymongo访问MongoDB数据库
4、Redis
Redis是一个使用ANSIC编写的高性能Key-Value数据库,使用内存作为主存储,内存中的数据也可以被持久化到硬盘
在Python可以使用第三方库redis-py访问Redis数据库
第13章 使用HTTP代理
1、HttpProxyMiddleware
HTTP代理服务器可以比作客户端与Web服务器(网站)之间的一个信息中转站,客户端发送的HTTP请求和Web服务器返回的HTTP响应通过代理服务器转发给对象
Scrapy内部提供了一个下载中间件HttpProxyMiddleware,专门用于给Scrapy爬虫设置代理
HttpProxyMiddleware默认便是启动的,它会在系统环境变量中搜索当前系统代理,作为Scrapy爬虫使用的代理
一般我们使用的是无须身份验证的代理服务器,还有一些代理服务器需要用户提供账号、密码进行身份验证,验证成功后才提供代理服务
2、使用多个代理
- 如果想使用多个代理,可以在构造每一个Request对象时,通过meta参数的proxy字段手动设置代理
3、获取免费代理
- 通过Google或百度找到一些免费代理服务器信息的网站
4、实现随机代理
5、项目实战:爬取豆瓣电影信息
第14章 分布式爬取
分布式爬取的思想是“人多力量大”,在网络中的多台计算机上同时运行爬虫程序,共同完成一个大型爬取任务
Scrapy本身并不是一个为分布式爬取而设计的框架,但第三方库scrapy-redis为其拓展了分布式爬取的功能,两者结合便是一个分布式Scrapy爬虫框架
在分布式爬虫框架中,需要使用某种通信机制协调各个爬虫的工作,让每一个爬虫明确自己的任务,其中包括:当前的爬取任务,即下载+提取数据(分配任务);当前爬取任务是否已经被其他爬虫执行过(任务去重);如何存储爬取到的数据(数据存储)
1、Redis的使用
Redis是一个非常快的非关系型数据库,使用内存作为主存储,其中德值可以分为以下5种类型:字符串string、哈希hash、列表list、集合set、有序集合zset
安装redis,在ubuntu上使用apt-get install redis-server
在Python中可以使用第三方库redis-py访问Redis数据库
2、scrapy-redis源码分析
scrapy-redis为多个爬虫分配爬取任务的方式:让所有爬虫共享一个存在于Redis数据库中德请求队列(替代各爬虫独立的请求队列),每个爬虫从请求队列中获取请求,下载并解析页面后,将解析出的新请求再添加到请求队列中,因此每个爬虫即是下载任务的生产者又是消费者
为实现多个爬虫的任务分配,scrapy-redis重新实现了以下组件:基于redis的请求队列(优先队列、FIFO、LIFO);基于Redis的请求去重过滤器(过滤掉重复的请求);基于以上两个组件的调度器
3、使用scrapy-redis进行分布式爬取
写在后面
- pdf书籍、笔记思维导图、资料打包下载地址:暂无
- 思维导图在线查看:点击打开
- 得到电子书地址:暂无