scrapy框架学习
scrapy框架基本使用
- 简介:所谓的框架其实就是一个被集成了很多功能且具有很强通用性的一个项目模板
- 学习: 学习是框架中集成好的各种功能的特性是作用
- 进阶:逐步探索框架的底层
- scrapy:是一个专门用来异步爬虫的框架
- 高性能的数据解析,请求发送,持久化存储,全站数据爬取,中间件,分布式
- 环境安装(win)
pip install wheel
下载twisted http://www.lfd.uci.edu
进入下载目录,执行pip install Twisted
pip3 install pywin32
pip3 install scrapy
创建一个工程
scrapy startproject ProName
- 目录结构
spiders:爬虫文件夹
必须存放一个爬虫源文件
settings.py: 工程的配置文件
cd ProName
- 创建爬虫源文件
scrapy genspider spiderName www.xxxx.com
编写对应的代码在爬虫文件中
执行工程
- scrapy crawl spiderName
执行工程后会默认工程所有日志信息。
指定类型日志的输出
- settings.py添加:LOG_LEVEL = ‘ERROR’
爬虫文件spiderName内容阐述
name: 爬虫文件的唯一标识
start_urls:起始url列表,存储的都是url.url可以被自动执行get请求的发送
parse方法:请求后的数据解析操作
- settings.py
1.禁止robots协议
2.指定日志类型: LOG_LEVEL=‘ERROR’
UA伪装
scrapy数据解析
- 使用: response.xpath(‘xpath表达式’)
- scrapy中的xpath直接定位到标签中存储的值或属性值取出,返回的是Selector对象,且相关的数据是存储到Selector对象的data属性中
需要调用extract,extract_first()取出字符串数据
持久化存储
- 基于终端指令的持久化存储
- 该种方式:只可以将parse方法的返回值存储到本地指定到文本文件中
- 基于管道的持久化存储(重要)
基于终端指令的持久化存储
命令: scrapyy crawl duanzi -o duanzi.csv
基于管道的持久化存储
- 在爬虫文件中进行数据解析
- 在items.py定义相关属性
步骤一中解析了几个字段的数据,在这就定义几个属性
name = scrapy.field()----field()定义的是万能类型的属性
- 在爬虫文件中将解析到的数据存储封装到item类型的对象中
导入项目文件的item中,实例化item对象,将解析到的数据存储到对象中
item = wangziproitem()
item ['title] = title,item[‘content’] = content,不可以通过.的形式调用属性
- 将item类型的对象提交给管道
yield item
- 在管道文件(pipelines.py)中,接收爬虫提交过来的数据,且对其进行任意形式的持久化存储
process_item是用来接收item对象的(参数item就是接收的item对象)item其实就是一个字典
- 在配置文件中开启管道机制
基于管道实现数据的备份
将爬取的数据分别存储到不同的载体中,
- 实现:将数据一份存储到mysql,一份存储到redis
- 问题:管道文件中的一个管道类是怎样工作的–一个管道类对应一种持久化存储方式
如果将数据存储到不同的载体中需要使用多个管道类
- 已经定义好的三个管道类,将数据写入到三个载体中进行存储
item 会根据优先级:只会被提交给优先级最高的那个管道类
优先级高的管道类需要在process_item中实现retuern item ,传递到下一个执行的管道类
import pymysql
# 将数据存储到mysql中
class MysqlPileLine(object):
conn = None
# 游标
cursor = None
def open_spider(self,spider):
self.conn = pymysql.Connect(host='127.0.0.1',port= '3306',user = 'root',passward = '123456',db = 'spider')
def process_item(self,item,spider):
self.cursor = self.conn.cursor()
sql = 'insert into 表名 values("%s","%s")'%(item['title'],item['content'])
#事务处理
try :
self.cursor.execute(sql)
self.comm.commit()
except: Exception as e:
print(e)
#事务回滚
self.conn.rollback()
import redis import Redis
# 将数据写入到redis中
class RedisPinline(object):
def open_spider(self,spider):
self.conn = redis(host='127.0.0.1'.port=6379)
def process_item(self,item,spider):
self.connlpush('duanzidata',item)
scrapy 的手动请求发送的全站数据爬取
- yield scrapy.Request(url,callback):GET
- callback 指定解析函数,用于解析数据
- yield scrapy.FormRequest(url,callback,formdata):POST
- formdata:字典,请求参数
- 为什么 start_urls列表中为什么会被自动请求
- 列表中的url其实是被start_requests这个方法实现get请求发送
- 可以使用父类方法的重写
- 如何将 start_urls列表中进行post请求,进行重写
五大核心组件
引擎(scrapy)
- 用来处理整个系统的数据流处理,触发事务(框架核心)
调度器(scheduler)
- 用来接受引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回,可以想象成
下载器(Downloader)
- 用来下载网页内容,并将网页内容返回给蜘蛛(scrapy下载器是建立在twisted这个高效的异步模型上的)
爬虫(spiders)
- 爬虫主要干活的,用于从特定的网页中提取自己想要的数据,即所谓的实体(item),用户也可以从中提取数据
项目管道(pipeline)
- 负责处理爬虫从网页中抽取的实体,主要功能是持久化实体,验证实体的有效性,清楚不必要的信息,
请求传参的深度爬取
- 深度爬取:爬取的数据没有在同一页面中(首页数据+详细页数据)