scrapy框架
一:框架介绍
Scrapy 是一个快速的高级网页爬行和网页抓取框架,用于抓取网站并从其页面中提取结构化数据。它可用于广泛的用途,从数据挖掘到监控和自动化测试
二、框架安装(尽量新建一个python环境,以免导致包冲突)
Windows:
conda安装:(个人安装步骤)
1、conda创建新环境;
2、进入环境activate scrapy_env
,并使用pip安装:①、
pip install pypiwin32
;
②、pip install scrapy
;
pip安装:
1、
pip install pypiwin32
;
2、pip install scrapy
;
Linux:
pip安装:
pip install scrapy
;(未测)
Ubuntu:
1、需要先安装依赖库:
sudo apt-get install python3 python3-dev python3-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev
;
2、然后pip安装:pip install scrapy
;
Mac:
conda安装:(个人安装步骤)
1、conda创建新环境;
2、进入环境,并使用pip安装:①、
pip install scrapy
;
pip安装:
pip install scrapy
;(未测);
注:如果依然有问题,请访问:
安装指南
三、框架使用(默认使用scrapy虚拟环境)
3.1、框架组件详解
3.1.1、组件介绍
引擎(Engine)
Engine
负责控制系统所有组件之间的数据流,并在发生某些动作时触发事件(框架核心);爬虫文件(Spider)
Spider
是由用户编写的自定义的类。 一方面用于从特定网页的Response
中提取自己需要的信息, 即所谓的项目数据(Item)。另一方面也可以从中提取出Request
,让Scrapy项目继续爬取下一个页面;蜘蛛中间件(Spider Middlewares)
Spider 中间件是位于
Engine
和Spider
之间的特定组件,能够处理Spider
的输入(Response
)和输出(Item
和Request
);
- 如果您需要执行以下操作之一,请使用
Spider Middlewares
:
- 根据
Response
内容为某些请求调用errback函数
而不是callback函数
;- 对
Spider
回调的输出做处理 - 更改/添加/删除Item
和Request
;- 处理
Spider
异常;- 对
start_requests
迭代器做处理;调度器(Scheduler)
用来接受
Engine
发过来的请求, 压入队列中, 并在Engine
再次请求的时候返回。可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么,同时去除重复的网址;下载器(Downloader)
用于下载网页内容, 并将网页内容返回给
Engine
继而返回给Spider
(Scrapy下载器是建立在twisted这个高效的异步模型上的);下载器中间件(Downloader Middlewares)
下载器中间件是位于
Engine
和Downloader
之间的特定组件,并在Request
从Engine
传递到Downloader
时处理Request
,以及从Downloader
传递到Engine
的Response
;
- 如果您需要执行以下操作之一,请使用
Downloader Middlewares
:
- 在将
Request
发送到Downloader
之前处理Request
(即在 Scrapy 将Request
发送到网站之前);- 在将
Response
传递给Engine
之前更改收到的Response
;- 发送一个新的
Request
而不是将接收到的Response
传递给Engine
;- 将
Response
传递给Engine
而不获取网页;- 默默地放弃一些
Request
;管道(Item Pipelines)
负责处理
Spider
从网页中抽取的Item
,主要的功能是持久化Item
、验证Item
的有效性、清除不需要的Item
。当页面被Spider
解析后,结果将被发送到Item Pipelines
,并经过几个特定的次序来处理Item
;
3.1.2、执行流程:
1、该
Engine
(引擎)从Spider
(蜘蛛)中获取最初Requests
(请求)进行爬行;
2、该Engine
将Requests
安排在Scheduler
(调度器),并且要求下一个Requests
进行爬行;
3、该Scheduler
返回下一个请求到Engine
;
4、该Engine
通过Downloader Middlewares
(下载器中间件)发送Requests
到Downloader
(下载器)(见process_request()
);
5、一旦页面完成下载,Downloader
会生成一个Response
(响应)(带有该页面)并通过Downloader Middlewares
将其发送到Engine
(见process_response()
);
6、该Engine
接收到来自Downloader
的Response
,并通过Spider Middlewares
(蜘蛛中间件)将其发送到Spider
进行处理(见process_spider_input()
);
7、该Spider
处理Response
并通过Spider Middlewares
返回网上下载的items(项目)和新的Requests
(为了跟进)到Engine
,(见process_spider_output()
);
8、该Engine
发送已处理的items到Item Pipelines
,然后发送已处理的Requests
到Scheduler
,并要求可能的Requests
进行爬行;
9、该过程重复(从第 1 步开始),直到不再有来自Scheduler
的请求 ;
文档:架构概览、Downloader Middleware、Spider Middleware、Requests and Responses;
3.2、前期准备(常用)
1、首先切换到虚拟环境,使用
activate
命令;
2、创建scrapy项目。命令为:scrapy startproject <project_name> [project_dir]
,并切换到项目目录;project_name:项目名称;
project_dir:项目所在的文件夹;
3、创建项目的spider文件,并定义爬虫类型以及可用域名。命令为:
scrapy genspider [-t template] <name> <domain>
;-t:制定爬虫模板,若无此参数,即为普通爬虫;
name:爬虫文件名称;
domain:允许访问的域名,其他域名不进行访问;
至此已经生成了
指定爬虫模板
、指定域名
的爬虫项目;
文档:命令行工具
3.3、单机爬虫(默认已做好前期准备)
注:需要将
settings.py
文件中的ROBOTSTXT_OBEY
属性设置为False
,即不遵守机器人协议;否则会报错:ModuleNotFoundError: No module named 'protego'
;
建议:将DEFAULT_REQUEST_HEADERS
(默认请求头)和DOWNLOAD_DELAY
(下载延迟)参数放开,并向DEFAULT_REQUEST_HEADERS
中添加User-Agent
,以及修改DOWNLOAD_DELAY
为1;
默认知识:已经大致了解html、js、xpath(个人常用)、css、selector等网页知识以及python入门;
3.3.1、简单scrapy案例
注:演示可执行的简单scrapy项目,不需要任何逻辑;
1、一般情况下,先将
start_urls
修改为最初的url(即第一个进行爬虫的url)
;
2、给wxapp_spider.py
文件下的parse
(解析)函数添加逻辑,如:(第6步使用)
class WxappSpiderSpider(scrapy.Spider):
name = 'wxapp_spider'
allowed_domains = ['wxapp-union.com']
start_urls = ['https://www.wxapp-union.com/portal.php?mod=list&catid=2&page=1']
def parse(self, response, **kwargs):
print(response.url)
3.1、在命令行中,切换到项目目录并切换到scrapy_env环境中,执行
scrapy crawl wxapp_spider
,即可运行该爬虫项目;
3.2、在pycharm
中创建一个start_scrapy.py
文件并在pycharm
工具中执行该文件,文件内容如下(其中./
代表与spider文件同一文件夹):
from scrapy import cmdline
import os
if __name__ == '__main__':
files