一:Scrapy的介绍:
(1)什么是Scrapy
Scrapy是一个用Python编写的网络爬虫框架,它提供了许多工具和功能,使得开发者可以轻松地构建强大的网络爬虫。
(2)Scrapy的主要特点包括:Scrapy核心组件与CrawlSpider类
- 快速:Scrapy使用了异步IO框架Twisted,使得爬虫可以同时处理多个请求,提高了爬取效率。
- 灵活:Scrapy提供了丰富的API和组件,开发者可以根据自己的需求定制爬虫的行为。
- 易用:Scrapy的API设计简洁明了,文档丰富,使得开发者可以快速上手。
- 社区活跃:Scrapy有一个活跃的社区,开发者可以在社区中寻求帮助、分享经验和学习最新的技术。
(3)Scrapy的优点和缺点
1:优点
- 异步处理:Scrapy使用了Twisted库,这使得它在处理网络请求时能够进行异步操作。这使得Scrapy能够同时处理多个请求,提高了爬虫的效率。
- 强大的选择器:Scrapy使用CSS选择器来定位和提取HTML中的元素。CSS选择器是一种非常强大的工具,能够快速准确地定位到页面中的特定元素。
- 内置的调度器:Scrapy有一个内置的调度器,可以保存和重新发送未完成的请求。这对于处理需要大量时间的爬虫任务非常有用,因为即使在短暂的网络中断后,爬虫也能够继续之前的工作。
- 支持分布式爬虫:Scrapy支持分布式爬虫,这意味着你可以使用多个爬虫同时抓取一个网站,从而大大提高爬取速度。
- 可扩展性:Scrapy的架构允许你轻松地添加自定义组件,如中间件、管道等。这使得Scrapy具有很高的可扩展性,可以根据你的需求进行定制。
- 社区支持:Scrapy有一个活跃的社区,提供了大量的教程、示例和插件。这意味着你可以在遇到问题时快速找到解决方案。
2:缺点
- 学习曲线:Scrapy的学习曲线相对较陡,尤其是对于初学者而言。它的文档和社区资源虽然丰富,但可能需要一些时间来熟悉其架构和工作原理。
- 配置复杂性:Scrapy的配置相对复杂,需要编写和配置多个文件,包括爬虫文件、设置文件、中间件等。这可能会增加开发时间和维护成本。
- 无法直接处理JavaScript:Scrapy默认无法处理JavaScript生成的内容。这意味着如果网站使用JavaScript来加载数据或渲染页面,Scrapy可能无法直接获取这些数据。虽然有一些方法可以绕过这个限制,如使用Selenium等工具,但这可能会增加复杂性和性能开销。
- 内存消耗:Scrapy在处理大量数据时可能会消耗较多的内存。这可能会导致性能下降或系统资源不足的问题。
- 分布式支持有限:虽然Scrapy支持分布式爬虫,但其内置的分布式支持相对较弱。要实现高效的分布式爬虫,可能需要额外的配置和工具,如使用Redis作为消息队列等。
- 不支持Windows:Scrapy官方并不支持Windows操作系统,尽管可以在Windows上运行Scrapy,但可能会遇到一些兼容性问题。
(4)Scrapy的组件
1:组成部分
Scrapy框架主要由五大组件组成,它们分别是调度器(Scheduler)、下载器(Downloader)、爬虫(Spider)和实体管道(Item Pipeline)、Scrapy引擎(Scrapy Engine)。下面我们分别介绍各个组件的作用。
调度器(Scheduler): | 调度器,说白了把它假设成为一个URL(抓取网页的网址或者说是链接)的优先队列,由它来决定下一个要抓取的网址是 什么,同时去除重复的网址(不做无用功)。用户可以自己的需求定制调度器。 |
下载器(Downloader): | 下载器,是所有组件中负担最大的,它用于高速地下载网络上的资源。Scrapy的下载器代码不会太复杂,但效率高,主要的原因是Scrapy下载器是建立在twisted这个高效的异步模型上的(其实整个框架都在建立在这个模型上的)。 |
爬虫(Spider): | 爬虫,是用户最关心的部份。用户定制自己的爬虫(通过定制正则表达式等语法),用于从特定的网页中提取自己需要的信息,即所谓的实体(Item)。 用户也可以从中提取出链接,让Scrapy继续抓取下一个页面。 |
实体管道(Item Pipeline): | 实体管道,用于处理爬虫(spider)提取的实体。主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后, 将被发送到项目管道, 并经过几个特定的次序处理数据. |
Scrapy引擎(Scrapy Engine): | Scrapy引擎是整个框架的核心.它用来控制调试器、下载器、爬虫。实际上,引擎相当于计算机的CPU,它控制着整个流程,对整个系统的数据流进行处理, 触发事务。 |
(5)scrapy工作流程
1:工作流程
2:网络爬虫工作流程图
二:Scrapy框架安装
(1)安装Scrapy
由于Windows 7系统默认没有安装Python,所以在安装Scrapy框架之前,需要保证Windows 7系统下已经安装了Python。在命令提示符窗口中使用pip工具安装Scrapy框架,然后在命令提示符窗口输入
pip install scrapy==2.5.0
(2)常见安装问题
1:缺少Microsoft Visual C++ 14.0组件
在Windows 7系统下安装Scrapy框架常见的两个问题是缺少Microsoft Visual C++ 14.0组件和Twisted安装出错。
以下是缺少Microsoft Visual C++ 14.0组件的报错代码
error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools
2:缺少Microsoft Visual C++ 14.0组件
在当前电脑上缺少Microsoft Visual C++ 14.0组件,则可以单独安装该组件。在浏览器中进入下载Microsoft Visual C++ 14.0组件的页面。完成下载后可以看到下载的安装包。双击安装包进行安装,在安装过程中全部保持默认设置即可,无须进行任何修改。 需要注意的是,我们在Visual Studio 2015组件安装完成之后需要重启计算机
3:Twisted安装出错
- 由于Scrapy框架使用了异步网络框架Twisted,所以在安装Scrapy的过程中需要安装Twisted。若没有安装Teisted,则出现以下信息。
fatal error C1083: Cannot open include file: 'basetsd.h': No such file or directory error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\BIN\\x86_amd64\\cl.exe' failed with exit status 2
- 若未安装Twisted,则可以单独安装。在浏览器中访问Twisted的下载页面。
- 在Twisted下载页面中选择适合自己电脑的安装包进行安装。
pip install Twisted 20.3.0 cp36 cp36m win32.whl
三:Scrapy框架基本操作
(1)创建Scapy项目
创建Scrapy项目需要使用如下命令:
scrapy startproject 项目名称
成功后会在该目录下生成对应项目文件:
(2)创建爬虫任务
1:创建爬虫
创建爬虫主要是为爬虫起一个名称
scrapy genspider 爬虫名称 "爬取域"
例如,在命令行窗口中切换当前的目录为子目录mdSpider/spiders,创建一个名称为itcast、爬取域为itcast.cn的爬虫。
scrapy genspider itcast "itcast.cn"
在PyCharm中打开mdSpider/spiders目录,可以看到新创建的itcast.py,该文件的内容已经自动生成。
四:命令语句
scrapy startproject <project_name> | 创建新的 Scrapy 项目 |
scrapy genspider <spider_name> | 创建新的爬虫 |
scrapy crawl <spider_name> | 运行爬虫 |
scrapy list | 列出可用的爬虫 |
scrapy crawl <spider_name> -o <output_file> | 导出爬取结果 |
scrapy crawl <spider_name> -a -s LOG_LEVEL=DEBUG | 运行爬虫并进行调试 |
scrapy crawl <spider_name> --spider <spider_name> --nolog -s LOG_LEVEL=INFO | 查看爬虫的详细信息 |
scrapy version | 显示 Scrapy 版本信息 |
scrapy check | 检查 Scrapy 项目的语法错误 |
scrapy runspider <spider_file> | 运行 Scrapy 命令并输出结果到标准输出 |
scrapy check <spider_file> | 检查爬虫文件的语法错误 |
scrapy crawl <spider_name> -s JOBDIR=<job_directory> --nolog | 清除爬虫的临时数据 |
scrapy crawl <spider_name> -o <output_file>.jl | 导出爬虫的数据到 JSON Lines 格式 |
scrapy crawl <spider_name> -o <output_file>.xml | 导出爬虫的数据到 XML 格式 |
scrapy crawl <spider_name> -s LOG_FILE=<log_file> | 运行爬虫并将日志输出到文件 |
五:scrapy.http
(1)scrapy.http的介绍
Scrapy是一个适用于Python的快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据,
from scrapy.http import Response:用于表示一个 HTTP 响应。包含响应的状态码、响应头、响应体等信息
- Response(url,status,headers,body,flags,request,certificate,ip_address,protocol):创建Response对象
- url (str): 响应的 URL 地址。
- status (int): 响应的状态码。
- headers (dict or Headers): 响应的头部信息。可以是字典形式的头部信息,也可以是 Headers 对象。
url 是新的 URL 地址,
encoding 是新的编码方式
response.urljoin(url):用来构造url
response.copy():创建当前响应的副本
response.url:响应的 URL 地址
response.status:响应的状态码
response.headers:响应的头部信息。
response.body:响应的原始 HTML 内容