python之scrapy框架(1)安装与一般流程

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

  1. response.xpath() 方法的返回结果是一个类似list的类型,其中包含的是selector对象
    操作和列表一样,但是有一些额外的方法
  2. extract() 返回一个包含有字符串的列表
  3. extract_first() 返回列表中的第一个字符串,列表为空没有返回None
  4. spider中的parse方法必须有
  5. 需要抓取的url地址必须属于allowed_domains,但是start_urls中的url地址没有这个限制
  6. 启动爬虫的时候注意启动的位置,是在项目路径下启动
    运行爬虫先进入到爬虫文件目录 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 # 默认过滤重复的请求
)
参数解释:

  1. 中括号里的参数为可选参数
  2. callback:表示当前的url的响应交给哪个函数去处理
  3. meta:实现数据在不同的解析函数中传递,meta默认带有部分数据,比如下载延迟,请求深度等
  4. dont_filter:默认为False,会过滤请求的url地址,即请求过的url地址不会继续被请求,对需要重复请求的
    url地址可以把它设置成True,比如贴吧的翻页请求,页面的数据总是在变化;start_urls中的地址会被反复请求,否则程序不会启动
  5. method:指定POST或GET请求
  6. headers:接受一个字典,其中不包括cooies
  7. cookies:接受一个字典,专门放置cookies
  8. 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模拟登陆

  1. 直接携带cookies
  2. 找到url地址,fasongpost请求储存cookies

发送post请求(阅读:“python使用scrapy发送post请求的坑”)
scrapy.FormRequest()来发送post请求

数据清洗

  1. 入库前清洗(爬虫)
    类型转换:
    字符串清理
  2. 入库后清洗(数据分析,数据挖掘)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值