Scrapy框架简介及小项目应用
今天来总结一下Scrapy框架的用法。scrapy的架构如下:

Engine :引擎,处理整个系统的数据流处理、触发事务,是整个框架的核心。
Items :项目,它定义了爬取结果的数据结构,爬取的数据会被赋值成该 Items 对象。
Scheduler :调度器,接受 Engine 发过来的请求,并将其加入队列中,在 Engine 再次请求的时候将请求提供给 Engine。
Downloader :下载器,下载网页内容,并将网页容返回给 Spiders。
Spiders : 蜘蛛,其内定义了爬取的逻辑和网页 解析规则 ,它主要负责解析响应并生成提取结果和新的请求。
ItemPipeline :项目管道,负责处理由 Spiders 从网页中提取的项目,它的主要任务是清洗、验证和存储数据。
Downloader Middlewares :下载器中间件,主要处理 Engine与 Downloader 之间的请求及响应。
Spide Middlewares : Spiders 中间件,主要处理 Spiders 输入的响应和输出的结果,及新的请求。
接下来介绍 个简单的项目,完成一遍 Scrapy抓取流程
1、打开 cmd 终端窗口, 输入 scrapy startproject abcd,生成一个 abcd 的项目
2、按照提示,输入 cd abcd 进入 abcd 项目所在的文件夹, 输入 scrapy genspider quotes quotes.toscrape.com,
quotes是 spiders 的 .py 文件,quotes.toscrape.com 是爬取的网站域名。

打开项目文件 quotes,里面包含内容如下:

allowed domains :它是允许爬取的域名,如果初始或后续的请求链接不是这个域名下的,则请求链接会被过滤掉
start_urls :它包含了 Spider 在启动时爬取的 url 列表,初始请求是由它来定义的
3、观察目标网站,我们可以获取到到内容有 text 、author、 tags,因此开始定义 Items.py
class AbcdItem(scrapy.Item):
# define the fields for your item here like:
text = scrapy.Field()
author = scrapy.Field()
tags = scrapy.Field()
4、进入quotes.py文件,在 parse函数下输入 print(response.text), 在终端输入 scrapy crawl quotes,看看能否正常请求到内容
结果报错:UnicodeEncodeError: 'gbk' codec can't encode character '' in position 11162: illegal multibyte sequence
是说编码错误,经过查资料,进行修改就改好了,https://blog.csdn.net/u013155359/article/details/81566807
import io
import sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gbk')
说是因为编码问题,但我还不太理解原因,暂且这么用
5、接下来进行quotes.py代码编写
def parse(self, response):
quotes = response.css('.quote')
for quote in quotes:
item = AbcdItem()
item['text'] = quote.css('.text::text').extract_first()
item['author'] = quote.css('.author::text').extract_first()
item['tags'] = quote.css('.tags .tag::text').extract()
yield item
终端运行,得到正确的输出
6、抓取下一页的内容
def parse(self, response):
quotes = response.css('.quote') # response 直接就是返回的内容
for quote in quotes:
item = QuoteItem()
text = quote.css('.text::text').extract_first()
author = quote.css('.author::text').extract_first()
tags = quote.css('.tags .tag::text').extract()
item['text'] = text
item['author'] = author
item['tags'] = tags
yield item
next = response.css('.pager .next a::attr(href)').extract_first()
url = response.urljoin(next) # 获取一个绝对的URL
yield scrapy.Request(url=url, callback=self.parse)
url = response.urljoin(next),获取一个绝对的 URL,next='page/2/',url='http://quotes.toscrape.com/page/2/yield scrapy.Request(url=url, callback=self.parse),重新调用 parse()函数,一直循环下去,运行结果正常输出所有内容。
7、将输出的内容保存下来,有一下四种方法,个人感觉保存为 json 或 jl 格式的文件看起来最清晰。
scrapy crawl quotes -o quotes.json
scrapy crawl quotes -o quotes.jl
scrapy crawl quotes -o quotes.xml
scrapy crawl quotes -o quotes.csv
8、保存到MongoDb数据库,这个稍微复杂一点,需要用到 Pipeline.py 文件。
先在 Pipeline.py 中写入以下代码:
import pymongo
from scrapy.exceptions import DropItem class TextPipeline(object):
def __init__(self):
self.limit = 50
def process_item(self, item, spider):
if item['text']:
if len(item['text']) > self.limit: # 对长度大于50的text进行修改
item['text'] = item['text'][0:self.limit].rstrip()+'...'
return item
else:
return DropItem('Missing Text') class MongoPipeline(object):
def __init__(self, mongo_uri, mongo_db):
self.mongo_uri = mongo_uri
self.mongo_db = mongo_db @classmethod
def from_crawler(cls, crawler):
return cls(
mongo_uri=crawler.settings.get('MONGO_URI'),
mongo_db=crawler.settings.get('MONGO_DB')
) def open_spider(self, spider):
self.client = pymongo.MongoClient(self.mongo_uri)
self.db = self.client[self.mongo_db] def process_item(self, item, spider):
name = item.__class__.__name__
self.db[name].insert(dict(item))
return item def close_spider(self, spider):
self.client.close()
定义了 TextPipeline() 和 MongoPipeline() 两个类。
TextPipeline() 和 MongoPipeline() 两个类都有 process_item 的方法,process item ()方法必须返回包含数据的字典或 Item 象,或者抛出 Dropltem 异常,
启用 Item Pipeline 后, Item Pipeline 会自动调用这个方法。
MondoPipeline() 类: from crawler(),通过 crawler 我们可以拿到全局配置的每个配置信息,这个方法的定义主要是用来获取 settings.py 中的配置。
open spider(), Spider 开启时,这个方法被调用
close_spider(), Spider 关闭时,这个方法会调用
process item () 方法则执行了数据插入操作
我们在 settings.py 中加入如下内容:
MONGO_URI='localhost'
MONGO_DB = 'abcd' ITEM_PIPELINES = {
'abcd.pipelines.TextPipeline': 300,
'abcd.pipelines.MongoPipeline': 400
}
在终端运行 scrapy crawl quotes,数据成功在 MongoDb 中保存下来。

Scrapy框架简介及小项目应用的更多相关文章
- 爬虫基础(五)-----scrapy框架简介
---------------------------------------------------摆脱穷人思维 <五> :拓展自己的视野,适当做一些眼前''无用''的事情,防止进入只关 ...
- 爬虫开发7.scrapy框架简介和基础应用
scrapy框架简介和基础应用阅读量: 1432 scrapy 今日概要 scrapy框架介绍 环境安装 基础使用 今日详情 一.什么是Scrapy? Scrapy是一个为了爬取网站数据,提取结构性数 ...
- Scrapy 框架简介
Scrapy 框架 介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速.简单.可扩展的方式从网站中提取所需的数据.但目前Scrapy的 ...
- 爬虫(九)scrapy框架简介和基础应用
概要 scrapy框架介绍 环境安装 基础使用 一.什么是Scrapy? Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能 ...
- 10.scrapy框架简介和基础应用
今日概要 scrapy框架介绍 环境安装 基础使用 今日详情 一.什么是Scrapy? Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被 ...
- scrapy框架简介和基础应用
scrapy框架介绍 环境安装 基础使用 一.什么是Scrapy? Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能(高性 ...
- 爬虫 (5)- Scrapy 框架简介与入门
Scrapy 框架 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页 ...
- (六--一)scrapy框架简介和基础应用
一 什么是scrapy框架 官方解释 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 其最初是为了 页面抓取 ( ...
- scrapy的一个简单小项目
使用scrapy抓取目标url下所有的课程名和价格,并将数据保存为json格式url=http://www.tanzhouedu.com/mall/course/initAllCourse 观察网页并 ...
随机推荐
- PowerPC-MPC56xx Flash模式启动过程
https://mp.weixin.qq.com/s/SpBOfzJJ1OizYP-rsLJVqQ Flash启动模式为最常用模式. 一般情况下,芯片上电之后,从flash起始位置读取第一条指令的 ...
- 【Hadoop】hdfs,剖析文件上传
文件上传原理图 剖析文件写入 1.客户端(client)通过对DistributedFileSystem对象调用create()来新建文件: FSDataOutputStream outputStre ...
- Java实现 LeetCode 713 乘积小于K的子数组(子集数量+双指针)
713. 乘积小于K的子数组 给定一个正整数数组 nums. 找出该数组内乘积小于 k 的连续的子数组的个数. 示例 1: 输入: nums = [10,5,2,6], k = 100 输出: 8 解 ...
- Java实现 蓝桥杯 历届真题 稍大的串
串可以按照字典序进行比较.例如: abcd 小于 abdc 如果给定一个串,打乱组成它的字母,重新排列,可以得到许多不同的串,在这些不同的串中,有一个串刚好给定的串稍微大一些.科学地说:它是大于已知串 ...
- Java实现背包问题
1 问题描述 给定n个重量为w1,w2,w3,-,wn,价值为v1,v2,-,vn的物品和一个承重为W的背包,求这些物品中最有价值的子集(PS:每一个物品要么选一次,要么不选),并且要能够装到背包. ...
- java实现第三届蓝桥杯火柴游戏
火柴游戏 [编程题](满分34分) 这是一个纵横火柴棒游戏.如图[1.jpg],在3x4的格子中,游戏的双方轮流放置火柴棒.其规则是: 不能放置在已经放置火柴棒的地方(即只能在空格中放置). 火柴棒的 ...
- java实现第六届蓝桥杯加法变乘法
加法变乘法 题目描述 我们都知道:1+2+3+ - + 49 = 1225 现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015 比如: 1+2+3+-+1011+12+-+2728+29+- ...
- java代码(2)---Java8 Stream
stream Java8新特性Stream流,那Stream表达式到底是什么呢,为什么可以使你的代码更加整洁而且对集合的操作效率也会大大提高? 一.概述 1.什么是Stream Stream是一种可供 ...
- Volcano火山:容器与批量计算的碰撞
[摘要] Volcano是基于Kubernetes构建的一个通用批量计算系统,它弥补了Kubernetes在“高性能应用”方面的不足,支持TensorFlow.Spark.MindSpore等多个领域 ...
- zabbix通过Web场景监控URL
选择主机添加应用集 添加Web监控 选在相应主机,并添加Web监控 按照方式新建Web场景 注意: 名称统一规则:相应的域名 应用集:选择之前创建的 或者 新建一个,名称为“URL 告警” ...