目录
一、基本框架介绍
二、安装与基本命令
三、scrapy框架基本使用及完整案例
四、各组件的一些用法说明
一、基本框架介绍
Scrapy框架介绍:
-
Scrapy
是: 由Python
语言开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。 -
Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。
-
Scrap,是碎片的意思,这个Python的爬虫框架叫Scrapy。
Scrapy框架的运行原理
-
引擎(Scrapy Engine)
- 用来处理整个系统的数据流处理, 触发事务(框架核心)
-
Item 项目,它定义了爬取结果的数据结构,爬取的数据会赋值成改Item对象
-
调度器(Scheduler)
- 用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回.
- 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
-
下载器(Downloader)
- 用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)
-
爬虫(Spiders)
- 爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
-
项目管道(Pipeline)
- 负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
-
下载器中间件(Downloader Middlewares)
- 位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
-
爬虫中间件(Spider Middlewares)
- 介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。
-
调度中间件(Scheduler Middewares)
- 介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。
数据处理流程
-
引擎打开一个域名,时蜘蛛处理这个域名,并让蜘蛛获取第一个爬取的URL。
- 引擎从蜘蛛那获取第一个需要爬取的URL,然后作为请求在调度中进行调度。
- 引擎从调度那获取接下来进行爬取的页面。
- 调度将下一个爬取的URL返回给引擎,引擎将它们通过下载中间件发送到下载器。
- 当网页被下载器下载完成以后,响应内容通过下载中间件被发送到引擎。
- 引擎收到下载器的响应并将它通过蜘蛛中间件发送到蜘蛛进行处理。
- 蜘蛛处理响应并返回爬取到的项目,然后给引擎发送新的请求。
- 引擎将抓取到的项目项目管道,并向调度发送请求。
- 系统重复第二部后面的操作,直到调度中没有请求,然后断开引擎与域之间的联系。
二、安装与基本命令
# 安装scrapy
$ pip install scrapy
$ pip list
# 获取页面内容
$ scrapy
$ scrapy fetch http://www.youkuaiyun.com
# 简单交互
$ scrapy shell http://www.youkuaiyun.com
: response.selector.re("<title>(.*?)</title>")
Scrapy 命令 分为两种:全局命令
和 项目命令
。
-
全局命令
:在哪里都能使用。 -
项目命令
:必须在爬虫项目里面才能使用。
全局命令
C:\Users\zhouxw>scrapy -h
Scrapy 1.2.1 - no active project
使用格式:
scrapy <command> [options] [args]
可用的命令:
bench 测试本地硬件性能(工作原理:):scrapy bench
commands
fetch 取URL使用Scrapy下载
genspider 产生新的蜘蛛使用预先定义的模板
runspider 运用单独一个爬虫文件:scrapy runspider abc.py
settings 获取设置值
shell 进入交互终端,用于爬虫的调试(如果你不调试,那么就不常用):scrapy shell http://www.baidu.com --nolog(--nolog 不显示日志信息)
startproject 创建一个爬虫项目,如:scrapy startproject demo(demo 创建的爬虫项目的名字)
version 查看版本:(scrapy version)
view 下载一个网页的源代码,并在默认的文本编辑器中打开这个源代码:scrapy view http://www.aobossir.com/
[ more ] 从项目目录运行时可获得更多命令
使用 "scrapy <command> -h" 要查看有关命令的更多信息
项目命令
项目命令里有几个选项全局命令里没有
D:\BaiduYunDownload\first>scrapy -h
Scrapy 1.2.1 - project: first
Usage:
scrapy <command> [options] [args]
Available commands:
bench Run quick benchmark test
check Check spider contracts
commands
crawl 运行一个爬虫文件。:scrapy crawl f1 或者 scrapy crawl f1 --nolog
edit 使用编辑器打开爬虫文件 (Windows上似乎有问题,Linux上没有问题):scrapy edit f1
fetch Fetch a URL using the Scrapy downloader
genspider Generate new spider using pre-defined templates
list 列出当前爬虫项目下所有的爬虫文件: scrapy list
parse Parse URL (using its spider) and print the results
runspider Run a self-contained spider (without creating a project)
settings 获取设置值
shell 进入交互终端,用于爬虫的调试(如果你不调试,那么就不常用)
startproject 创建一个爬虫项目,如:scrapy startproject demo(demo 创建的爬虫项目的名字)
version 查看版本:(scrapy version)
view 下载一个网页的源代码,并在默认的文本编辑器中打开这个源代码
Use "scrapy <command> -h" to see more info about a command
三、scrapy框架基本使用及案例
框架使用方法
① 使用scrapy startproject命令来创建一个项目
② 进入项目目录,创建爬虫spider类文件
③ 进入items.py创建自己的Item容器类
④ 进入自定义的spider类,解析Response信息,并封装到Item中
⑤ 使用Item Pipeline项目管道对解析出来的Item数据进行清理、验证、去重、存储。
⑥ 执行爬取命令来进行爬取信息。
案例实战
-
任务:爬取csdn学院中的课程信息(编程语言的)
-
网址:
https://edu.youkuaiyun.com/courses/o280/p1
(第一页) https://edu.youkuaiyun.com/courses/o280/p2
(第二页)
① 创建项目
- 在命令行编写下面命令,创建项目educsdn
scrapy startproject educsdn
- 项目目录结构:
educsdn
├── educsdn
│ ├── __init__.py
│ ├── __pycache__
│ ├── items.py # Items的定义,定义抓取的数据结构
│ ├── middlewares.py # 定义Spider和DownLoader的Middlewares中间件实现。
│ ├── pipelines.py # 它定义Item Pipeline的实现,即定义数据管道
│ ├── settings.py # 它定义项目的全局配置
│ └── spiders # 其中包含一个个Spider的实现,每个Spider都有一个文件
│ ├── __init__.py
│ └── __pycache__
└── scrapy.cfg #Scrapy部署时的配置文件,定义了配置文件路径、部署相关信息等内容
② 进入educsdn项目目录,创建爬虫spider类文件(courses课程)
- 执行genspider命令,第一个参数是Spider的名称,第二个参数是网站域名。
scrapy genspider courses edu.youkuaiyun.com
├── educsdn
│ ├── __init__.py
│ ├── __pycache__
│ │ ├── __init__.cpython-36.pyc
│ │ └── settings.cpython-36.pyc
│ ├── items.py
│ ├── middlewares.py
│ ├── pipelines.py
│ ├── settings.py
│ └── spiders
│ ├── __init__.py
│ ├── __pycache__
│ │ └── __init__.cpython-36.pyc
│ └── courses.py #在spiders目录下有了一个爬虫类文件courses.py
└── scrapy.cfg
# courses.py的文件代码如下: (这是此时的初始代码)
# -*- coding: utf-8 -*-
import scrapy
class CoursesSpider(scrapy.Spider):
name = 'courses'
allowed_domains = ['edu.youkuaiyun.com']
start_urls = ['http://edu.youkuaiyun.com/']
def parse(self, response):
pass
-
Spider是自己定义的类,Scrapy用它来从网页中抓取内容,并解析抓取结果。
-
此类继承Scrapy提供的Spider类scrapy.Spider,类中有三个属性:name、allowed_domains、start_urls和方法parse。
-
name:是每个项目唯一名字,用于区分不同Spider。
- allowed_domains: 它是允许爬取的域名,如果初始或后续的请求链接不是这个域名,则请求链接会被过滤掉
- start_urls: 它包含了Spider在启动时爬取的URL列表,初始请求是由它来定义的。
- parse方法: 调用start_urls链接请求下载执行后则调用parse方法,并将结果传入此方法。
③ 创建Item
-
Item是保存爬取数据的容器,它的使用方法和字典类型,但相比字典多了些保护机制。
-
创建Item需要继承scrapy.Item类,并且定义类型为scrapy.Field的字段:(课程标题、课程地址、图片、授课老师,视频时长、价格)
-
具体代码如下:(修改类名为CoursesItem)
import scrapy
class CoursesItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field()
url = scrapy.Field()
pic = scrapy.Field()
teacher = scrapy.Field()
time = scrapy.Field()
price = scrapy.Field()
#pass
④ 解析Response
-
在courses.py文件中,parse()方法的参数response是start_urls里面的链接爬取后的结果。
-
提取的方式可以是CSS选择器、XPath选择器或者是re正则表达式。
# -*- coding: utf-8 -*-
import scrapy
from educsdn.items import CoursesItem
class CoursesSpider(scrapy.Spider):
name = 'courses'
allowed_domains = ['edu.youkuaiyun.com']
start_urls = ['https://edu.youkuaiyun.com/courses/o280/p1']
p=1
def parse(self, response):
#解析并输出课程标题
#print(response.selector.css("div.course_item span.title::text").extract())
#获取所有课程
dlist = respon