Scrapy是一个为了爬取网站数据,提取数据而编写的应用框架,爬虫的三步:获取网页,解析网页,存储网页都整合成了这个爬虫框架
Scrapy框架主要由五大组件组成,它们分别是调度器(Scheduler)、下载器(Downloader)、爬虫(Spider)和实体管道(Item Pipeline)、Scrapy引擎(Scrapy Engine)。下面我们分别介绍各个组件的作用。
(1)、调度器(Scheduler):
调度器,说白了把它假设成为一个URL(抓取网页的网址或者说是链接)的优先队列,由它来决定下一个要抓取的网址是 什么,同时去除重复的网址(不做无用功)。用户可以自己的需求定制调度器。
(2)、下载器(Downloader):
下载器,是所有组件中负担最大的,它用于高速地下载网络上的资源。Scrapy的下载器代码不会太复杂,但效率高,主要的原因是Scrapy下载器是建立在twisted这个高效的异步模型上的(其实整个框架都在建立在这个模型上的)。
(3)、 爬虫(Spider):
爬虫,是用户最关心的部份。用户定制自己的爬虫(通过定制正则表达式等语法),用于从特定的网页中提取自己需要的信息,即所谓的实体(Item)。 用户也可以从中提取出链接,让Scrapy继续抓取下一个页面。
(4)、 实体管道(Item Pipeline):
实体管道,用于处理爬虫(spider)提取的实体。主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。
(5)、Scrapy引擎(Scrapy Engine):
Scrapy引擎是整个框架的核心.它用来控制调试器、下载器、爬虫。实际上,引擎相当于计算机的CPU,它控制着整个流程。
创建一个Scrapy项目
在开始爬取前,必须创建一个新的Scrapy项目。在cmd中进入一个自定义目录,例如
cd c:\users\aaa\desktop
scrapy startproject blogSpider
blogSpider是项目名称
目录结构
blogSpider/
scrapy.cfg
blogSpider/
__init__.py
items.py #定义需要保存的字段
pipelines.py #对应管道组件,用来存储数据
settings.py #项目的设置文件
spiders/ #对应爬虫器,用来解析网页,提取数据
__init__.py
在开始爬虫前,需要定义爬虫的目标字段,例如,需要获取www.baidu.com中所有文章的标题,链接,以及文章内容,打开items.py,在BlogspiderItem类输入以下需要的字段:
import scrapy
class BlogspiderItem(scrapy.Item):
title = scrapy.Filed()
link = scrapy.Filed()
content = scrapy.Filed()
这里的scrapy.item类,类型为scrap.Field的类属性来定义一个Item 。item 有点像python里的dict字典
获取博客 网页并保存
在cmd的当前目录下
scrapy genspider adc www.baidu.com
在blogSpider/spider 创建了一个adc.py的文件,定义了名为adc的爬虫,并制定了爬取的范围www.baidu.com
打开adc.py文件,可以看到默认的代码如下:
import scrapy
class adcSpider(scrapy.Spider):
name = "adc"
allowed_domains = ["www.baidu.com"]
start_urls = ["http://www.baidu.com/?]
def parse(self,response):
passs
**创建爬虫器必须要继承scrapy.Spider类**
除了在cmd中创建之外,也可以自己创建adc.py文件
name: 爬虫器唯一的名字,不同的爬虫不能使用相同的名字
allow_domains=[]: 是搜索的域名范围,规定爬虫只会爬出这个域名下的网页
start_urls: 爬虫器在启动时会爬取的url列表
parse():爬虫器的一个方法,获取到爬虫的下载response,之后解析网页
接下来,修改parse()获取网页并保存在本地
def parse(self,response):
print(response.text)
filename = "index.html"
with open(filename,"w",enconding = "utf-8") as f:
f.wirte(response.text)
然后在cmd里的bliogSpider目录下执行
scrapy crawl adc
上述代码中的adc就是本项目之前定义的名字。运行完成后,如果打印的日志里出现[scrapy.core.engine] INFO:Closing spider(finished),那么代表了执行完成。进入文件夹,可以看到当前文件加出现了 index,html文件,那么这就是爬取页面的源代码