介绍
Scrapy是Python开发的一个爬虫框架,可以用于数据挖掘、监测和自动化测试、信息处理等领域,它使用Twisted个异步网络库来处理网络通讯,架构清晰,包含了各种中间件接口,可以灵活的完成各种需求。
1、scrapy架构、流程与组件
1.1、整体架构图
spiders > scheduler > downloader > spiders > item pipeline
1.2、整体处理流程
1、引擎从调度器中取出一个url用于接下来的爬取
2、引擎把url封装成一个Request请求传给下载器
3、下载器下载资源后返回响应数据Response
4、爬虫解析Response
5、解析出的实体数据Item交给管道处理
6、解析出的url再次交给调度器等待爬取
1.3、主要组件
组件 | 说明 |
---|---|
引擎(Scrapy) | 用来处理整个系统的数据流处理, 触发事务(框架核心) |
调度器(Scheduler) | 用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回,可以看做一个URL优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址 |
下载器(Downloader) | 用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的) |
爬虫(Spiders) | 爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面 |
项目管道(Pipeline) | 负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据 |
下载器中间件(Downloader Middlewares) | 位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应 |
爬虫中间件(Spider Middlewares) | 介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出 |
调度中间件(Scheduler Middewares) | 介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应 |
2、安装
安装Scrapy:pip3 install Scrapy
安装pypiwin32:pip install pypiwin32
3、基本用法
4.1、创建项目
在对应项目下执行命令scrapy startproject xxxx
(xxxx指项目名称),即可初始化项目
D:\3.dev\pyworkspace\scraw\test01>scrapy startproject scrapy01
New Scrapy project 'scrapy01', using template directory 'c:\users\fxkp\appdata\local\programs\python\python36\lib\site-packages\scrapy\templates\project', created in:
D:\3.dev\pyworkspace\scraw\test01\scrapy01
You can start your first spider with:
cd scrapy01
scrapy genspider example example.com
4.2、目录结构
目录结构如下:
目录/文件 | 说明 |
---|---|
spiders | 爬虫目录,如:创建文件,编写爬虫规则 |
items.py | 设置数据存储模板,用于结构化数据 |
pipelines | 数据处理行为,如:一般结构化的数据持久化 |
settings.py | 配置文件,如:递归的层数、并发数,延迟下载等 |
scrapy.cfg | 项目的配置信息,主要为Scrapy命令行工具提供一个基础的配置信息。(真正爬虫相关的配置信息在settings.py文件中) |
4.3、编写爬虫文件
创建爬虫文件,进入到scrapy01目录
下,执行命令scrapy genspider 爬虫名称 站点域名
,如下会自动生成baidu.py
爬虫文件
D:\3.dev\pyworkspace\scraw\test01\scrapy01>scrapy genspider baidu baidu.com
Created spider 'baidu' using template 'basic' in module:
scrapy01.spiders.baidu
baidu.py
文件内容如下
# -*- coding: utf-8 -*-
import scrapy
class BaiduSpider(scrapy.Spider):
# 爬虫名称
name = 'baidu'
# 爬虫允许访问的域
allowed_domains = ['baidu.com']
# 初始访问地址(手动修改为自己想要的地址)
start_urls = ['http://www.baidu.com/']
def parse(self, response):
print(response.text)
修改settings.py
文件中的USER_AGENT
和ROBOTSTXT_OBEY
配置
# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36'
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
4.3、编写启动脚本
在scrapy01目录
下创建start.py
脚本,编写如下启动命令,这样就可以运行baidu爬虫
了
from scrapy.cmdline import execute
# 启动命令
execute('scrapy crawl baidu'.split())