1.Scrapy基本介绍
Scrapy是一个基于Twisted的异步处理框架,是纯python实现的爬虫框架,具有架构清晰,模块间耦合度低,可扩展性强等特点。
整个框架由Engine(引擎)、Item(项目)、Scheduler(调度器)、Downloader(下载器)、Spiders(蜘蛛)、Item Pipeline(项目管道)、Downloader Middlewares(下载中间件)、Spider Middlewares(蜘蛛中间件)组成。
其中每个组件的作用简要描述为:
Engine:处理整个系统的数据流、事务,框架的核心。
Item:定义爬取结果的数据结果,爬取数据构建程该类型对象。
Schduler:接受引擎发过来的请求并加入队列中,并在引擎再次请求时提供给引擎。
Downloader:下载网页内容,并将网页内容返回给Spider。
Item Pipeline:负责处理Spider从网页中抽取的项目,负责解析响应并生成提取结果和新的请求。
Spider:定义爬取的逻辑和网页的解析规则,解析响应并提取新的请求。
Downloader Middlewares:位于引擎和下载器之间的钩子框架,处理引擎与下载器之间的请求及响应。
Spider Middlewares:位于引擎和蜘蛛蜘蛛之间的钩子框架,处理蜘蛛输入的响应和输出的结果及新的请求。
2.框架文件结构
scrapy.cfg
project/
__init__.py
items.py
pipelines.py
settings.py
middlewares.py
spiders/
__init__.py
spiderRequest.py
...
其中:
scrapy.cfg:配置Scrapy项目,定义了项目的配置路径。部署相关信息等内容。
items.py:定义Item数据结构。
pipelines.py:定义Item Pipeline的实现。
settings.py:定义项目的全局配置。
middleware:定义Spider middleware和Downloader Middleware的实现。
spiders:包含具体Spider的实现。
3.创建Scrapy项目
1.使用命令行行方式安装Scrapy,命令如下:
pip install scrapy
2.创建一个Scrapy项目,格式如下:
scrapy startproject 'ProjectName'
3.创建一个‘Spider’爬取网站并提取数据;
cd ProjectName
scrapy genspider Test
4.重写"items.py"中“ProjectNameItem"类,打开项目中’TestSpider.py’文件,重写"TestSpider"类即可:
#version 1.0 修改items.py文件,获取当前网页中文本、作者、标签内容
#items.py
import scrapy
class TestItem(scrapy.Item):
# define the fields for your item here like:
text = scrapy.Field()
author = scrapy.Field()
tags = scrapy.Field()
#TestSpider.py
import scrapy
class TestSpider(scrapy.Spider):
name = 'test'
allowed_domains = ['quotes.toscrape.com']
start_urls = ['http://quotes.toscrape.com/']
def parse(self, response):
quotes = response.css('.quote')
for quote in quotes:
item = TutorialItem()
text = quote.css('.text::text').extract_first()
author = quote.css('.author::text').extract_first()
tags = quote.css('.tags .tags::text').extract()
5.并修改"TestSpider.py"文件中的"TestSpider"类型,修改支持递归调用下一页,代码如下:
#version 2.0 并修改"TestSpider.py"文件
#TestSpider.py
import scrapy
from ProjectName.items import ProjectNameItem
class TestSpider(scrapy.Spider):
name = 'test'
allowed_domains = ['quotes.toscrape.com']
start_urls = ['http://quotes.toscrape.com/']
def parse(self, response):
quotes = response.css('.quote')
for quote in quotes:
item = TutorialItem()
item['text'] = quote.css('.text::text').extract_first()
item['author'] = quote.css('.author::text').extract_first()
item['tags'] = quote.css('.tags .tags::text').extract()
yield item
next = response.css('.paper .next a::attr(href)').extract_first()
url = response.urljoin(next)
yield scrapy.Request(url=url,callback=self.parse)
6.将运行结果保存到指定类型的对应文件中,常见类型文件如csv、xml、jason、jsonlines等。
scrapy crawl Test -o Test.csv
scrapy crawl Test -o Test.jason
scrapy crawl Test -o Test.xml