scrapy框架
scrapy框架使用了Twisted['twɪstɪd]异步网络框架,可以加快我们的下载速度。
默认同时16个并发请求
安装:scrapy命令:sudo apt-get install scrapy 或者 pip install scrapy
一、异步和非阻塞的区别
异步是过程,非阻塞是状态
异步:调用在发出之后,这个调用就直接返回,不管有无结果,异步是过程
非阻塞:关注的是程序在等待调用结果(消息,返回值)时的状态,指在不能立刻得到结果之前,该调用不会阻塞当前线程
起始请求不做去重
二、scrapy框架执行步骤
1.Spiders模块发起起始的请求,起始的请求交给引擎,引擎调用调度器的put方法将请求放到调度器队列中
2.引擎调用调度器的get方法,获取一个请求,将该请求交给下载器
3.下载器将请求对应的响应返回给引擎,引擎将响应交给Spiders模块的解析响应功能
4.Spiders模块将解析出来的数据和新的url构建的请求返回给引擎
5.引擎判断Spiders返回的数据如果是请求对象,则调用调度器的put功能将请求放入调度器队列中
如果是数据,则将数据交给itempipelie进行保存或者后续处理
所有的模块都是相对独立的,他们和引擎相交互,由引擎进行分配
三、scrapy开发流程
1.创建项目
scrapy startproject 项目名字
2.明确目标
在items.py文件中建模
3.实现爬虫
创建爬虫
scrapy genspider <爬虫名字> <允许爬取的域名>
爬虫名不能和项目目录重名,爬虫名和爬虫名不能重名
允许的域决定了爬虫爬取的范围
完善爬虫
1. start_url
2. domain
3. parse方法
4.保存数据
在pipeline文件中定义管道类
在settings文件中注册使用管道
四、完善spider
- response.xpath() 方法的返回结果是一个类似list的类型,其中包含的是selector对象
操作和列表一样,但是有一些额外的方法 - extract() 返回一个包含有字符串的列表
- extract_first() 返回列表中的第一个字符串,列表为空没有返回None
- spider中的parse方法必须有
- 需要抓取的url地址必须属于allowed_domains,但是start_urls中的url地址没有这个限制
- 启动爬虫的时候注意启动的位置,是在项目路径下启动
运行爬虫先进入到爬虫文件目录 scrapy crawl 爬虫名
五、使用yield的好处
让整个函数变成一个生成器,遍历这个函数的返回值的时候,挨个把数据读取到内存,不会造成内存的瞬间占用过高
yield能够传递的对象只能是:BaseItem,Request,dict,None
六、完善pipeline
有多个pipeline的时候,process_item的方法必须return item,否则后一个pipeline取到的数据为None值
pipeline中process_item的方法必须有,否则item没有办法接受和处理
process_item方法接受item和spider,其中spider表示当前传递item过来的spider
七、scrapy.Request 请求类
crapy.Request的更多参数
scrapy.Request(url[,callback,method=“GET”,headers,body,cookies,meta,dont_filter=False])
Request(url,
callback=指定解析函数,
headers={不包含cookies},
cookies={cookies_dict},
method=‘GET’,
body={post请求的data请求体},
meta={要传递的数据},
dont_filter=False # 默认过滤重复的请求
)
参数解释:
- 中括号里的参数为可选参数
- callback:表示当前的url的响应交给哪个函数去处理
- meta:实现数据在不同的解析函数中传递,meta默认带有部分数据,比如下载延迟,请求深度等
- dont_filter:默认为False,会过滤请求的url地址,即请求过的url地址不会继续被请求,对需要重复请求的
url地址可以把它设置成True,比如贴吧的翻页请求,页面的数据总是在变化;start_urls中的地址会被反复请求,否则程序不会启动 - method:指定POST或GET请求
- headers:接受一个字典,其中不包括cooies
- cookies:接受一个字典,专门放置cookies
- body:接收json字符串,为POST的数据,发送payload_post请求时使用
meta的形式:字典
meta的作用:meta可以实现数据在不同的解析函数中的传递
response.meta[‘xxx’]
response.meta.get(‘xxx’,‘如果取不到指定的默认值’)
八、settings配置文件
USER_AGENT 设置ua
ROBOTSTXT_OBEY 是否遵守robots协议,默认是遵守
CONCURRENT_REQUESTS 设置并发请求的数量,默认是16个
DOWNLOAD_DELAY 下载延迟,默认无延迟
COOKIES_DEBUG = True # 开启cookies传递的日志,默认为False不开启
COOKIES_ENABLED = True 是否开启cookie,即每次请求带上前一次的cookie,默认是开启的
DEFAULT_REQUEST_HEADERS 设置默认请求头
SPIDER_MIDDLEWARES 爬虫中间件,设置过程和管道相同
DOWNLOADER_MIDDLEWARES 下载中间件
LOG_LEVEL = ‘WARNING’ # 设定日志显示的级别
LOG_FILE = ‘指定的日志的路径’
# 如果设置了LOG_FILE将不再显示日志信息
# 被指定日志级别的信息会写入该文件中
其他配置信息:https://www.jianshu.com/p/df9c0d1e9087
九、管道的深入使用
在管道中,除了必须定义process_item之外,还可以定义两个方法:
open_spider(spider) :能够在爬虫开启的时候执行一次
close_spider(spider) :能够在爬虫关闭的时候执行一次
所以,上述方法经常用于爬虫和数据库的交互,在爬虫开启的时候建立和数据库的连接,在爬虫关闭的时候断开和数据库的连接
管道pipelines.py
open_spider(spider)
# 在爬虫开启时只执行一次
close_spider(spider)
# 在爬虫关闭时只执行一次
process_item(item, spider):
if isinstance(spider, 导入的爬虫类对象):
print(item)
if spider.name == ‘爬虫名’:
print(item)
return item
# 如果不返回item,其他权重低的管道将无法接收到item
十、拓展
scrapy模拟登陆
- 直接携带cookies
- 找到url地址,fasongpost请求储存cookies
发送post请求(阅读:“python使用scrapy发送post请求的坑”)
scrapy.FormRequest()来发送post请求
数据清洗
- 入库前清洗(爬虫)
类型转换:
字符串清理 - 入库后清洗(数据分析,数据挖掘)