总结:

1.中间件:下载中间件(拦截请求和响应)

- process_request:

- prceess_response:

- process_exception:

- 请求:

- UA伪装:

- process_request进行操作:request.headers['User-Agent'] = 'xxx'

- 代理IP:

- process_exception进行操纵:request.meta['proxy'] = 'http://ip:port'

- 响应:

- selenium在scrapy中的编码流程:

- 在爬虫类中的构造方法中实例化一个浏览器对象

- 在爬虫类的closed(self,spider)方法中关闭浏览器对象

- 在下载中间件的prceess_response方法中编写自动化的操作

2.CrawlSpider:进行全站数据的爬取

- 创建爬虫文件:scrapy genspider -t crawl xxx www.xxx.com

- 连接提取器:可以根据指定的规则进行连接的提取

- 规则解析器:将连接提取器提取到的连接进行请求的发送且根据指定规则进行数据解析

- follow=True:

- 一对一的关系。

3.分布式爬虫

- 环境安装:pip install scrapy-redis

- 爬虫文件(CralSpider)的修改:

- 导包:form scrapy_redis.spiders import RedisCrawlSpider

- 将爬虫文件的父类修改成RedisCrawlSpider

- 删除allow_demains和start_url属性

- 添加一个新属性:redis_key = 'xxx'

- 进行数据解析(yield item)

- 配置文件:
- 在配置文件中进行指定管道的配置
- 在配置文件中进行指定调度器的配置
- redis的配置:
- bind注释
- 关闭保护模式
- 开启redis
- 运行:
- scrapy runspider xxx.py
- 向调度器的队列中放入一个起始的url:
- redis-cli:lpush xxx www.xxx.com

4.增量式爬虫:去重,监测

- 对url进行去重:
- 对爬取的数据进行去重:数据指纹

scrapy 限速

  • settings 配置
# 开启自动限速设定:
AUTOTHROTTLE_ENABLED = True
# 设定爬取速度
DOWNLOAD_DELAY = 3

scrapy 暂定与重启

  1. 然后在项目目录下创建 记录文件:spi_file/001

    (spi_file与spider同级)

    然后输入:

    scrapy crawl zhihu -s JOBDIR=spi_file/001 回车运行就行了

  2. 按ctrl+c 暂停

  3. 继续运行只要再次输入:scrapy crawl zhihu -s JOBDIR=remain/001就行了

  4. 需要重新爬取就换个文件 002就行了

scrapy 框架的自定义命令文件

  • 新建一个文件 再项目的最外层目录
from scrapy.cmdline import execute

if __name__ == '__main__':
execute(['scrapy', 'crawl', 'haha', '--nolog'])

scrapy_redis 实现深度优先 广度优先

'''
通俗的讲:
深度优先:一个一个节点往下找,不找兄弟节点,每一个深度一个节点,先进去的后出来
广度优先:横向取值,一个节点有关联其他的节点,一同被取出来,一个深度多个节点,先进去的先出来
'''
# 在settings里面的配置: from scrapy_redis.queue import PriorityQueue,FifoQueue,LifoQueue
# 先进先出:广度优先
SCHEDULER_QUEUE_CLASS='scrapy_redis.queue.FifoQueue'
# 后进先出:深度优先
SCHEDULER_QUEUE_CLASS='scrapy_redis.queue.LifoQueue'
# 优先级队列:
SCHEDULER_QUEUE_CLASS='scrapy_redis.queue.PriorityQueue'
#优先级队列里面也有深度优先和广度优先: requets.priority=1 广度优先
requets.priority=1 深度优先 # 实现原理:
'''
from scrapy_redis import queue
prio=1
depth = response.meta['depth'] + 1
requets.priority -= depth*self.prio 每一次循环,depth加1
同一个深度可以找到很多url(兄弟节点) 如果是1的话,广度优先 广度优先:
depth 优先级
1 -1
1 -1
1 -1
2 -2 从深度为1的开始往下找,优先级也越大
重点:深度越小,优先级越小
'''
def push(self, request):
"""Push a request"""
data = self._encode_request(request)
score = -request.priority##取反,注意 ''' 优先级队列:
放进队列里面:
反一下
1 1
1 1
1 1
2 2
''' print('这里优先级是',score)
print(request.meta.get('depth'))
# We don't use zadd method as the order of arguments change depending on
# whether the class is Redis or StrictRedis, and the option of using
# kwargs only accepts strings, not bytes.
self.server.execute_command('ZADD', self.key, score, data)
#按照分值来看 def pop(self, timeout=0):
"""
Pop a request
timeout not support in this queue class
"""
# use atomic range/remove using multi/exec
##开启事物
pipe = self.server.pipeline()
pipe.multi()
##取第一个值出来,拿出一个删除一个
pipe.zrange(self.key, 0, 0).zremrangebyrank(self.key, 0, 0)
results, count = pipe.execute()
if results:
return self._decode_request(results[0]) # 最终pop是按照这个优先级来取值的,优先级越小的越先被取出来,优先级从小多大取值
# 总结:就是深度越小,优先级越小,越先被取出来>>广度优先(先进先出,横向取值) # 深度优先:
先进后出:一个一个节点的往下面执行
深度越大,优先级越小,越先被pop出来
深度优先类似,就不多说了

Scrapy 框架 总结的更多相关文章

  1. Python爬虫Scrapy框架入门(2)

    本文是跟着大神博客,尝试从网站上爬一堆东西,一堆你懂得的东西 附上原创链接: http://www.cnblogs.com/qiyeboy/p/5428240.html 基本思路是,查看网页元素,填写 ...

  2. Python爬虫Scrapy框架入门(1)

    也许是很少接触python的原因,我觉得是Scrapy框架和以往Java框架很不一样:它真的是个框架. 从表层来看,与Java框架引入jar包.配置xml或.property文件不同,Scrapy的模 ...

  3. Scrapy框架使用—quotesbot 项目(学习记录一)

    一.Scrapy框架的安装及相关理论知识的学习可以参考:http://www.yiibai.com/scrapy/scrapy_environment.html 二.重点记录我学习使用scrapy框架 ...

  4. Python爬虫从入门到放弃(十一)之 Scrapy框架整体的一个了解

    这里是通过爬取伯乐在线的全部文章为例子,让自己先对scrapy进行一个整理的理解 该例子中的详细代码会放到我的github地址:https://github.com/pythonsite/spider ...

  5. Python爬虫从入门到放弃(十二)之 Scrapy框架的架构和原理

    这一篇文章主要是为了对scrapy框架的工作流程以及各个组件功能的介绍 Scrapy目前已经可以很好的在python3上运行Scrapy使用了Twisted作为框架,Twisted有些特殊的地方是它是 ...

  6. python爬虫scrapy框架——人工识别登录知乎倒立文字验证码和数字英文验证码(2)

    操作环境:python3 在上一文中python爬虫scrapy框架--人工识别知乎登录知乎倒立文字验证码和数字英文验证码(1)我们已经介绍了用Requests库来登录知乎,本文如果看不懂可以先看之前 ...

  7. 一个scrapy框架的爬虫(爬取京东图书)

    我们的这个爬虫设计来爬取京东图书(jd.com). scrapy框架相信大家比较了解了.里面有很多复杂的机制,超出本文的范围. 1.爬虫spider tips: 1.xpath的语法比较坑,但是你可以 ...

  8. 安装scrapy框架的常见问题及其解决方法

    下面小编讲一下自己在windows10安装及配置Scrapy中遇到的一些坑及其解决的方法,现在总结如下,希望对大家有所帮助. 常见问题一:pip版本需要升级 如果你的pip版本比较老,可能在安装的过程 ...

  9. 关于使用scrapy框架编写爬虫以及Ajax动态加载问题、反爬问题解决方案

    Python爬虫总结 总的来说,Python爬虫所做的事情分为两个部分,1:将网页的内容全部抓取下来,2:对抓取到的内容和进行解析,得到我们需要的信息. 目前公认比较好用的爬虫框架为Scrapy,而且 ...

  10. 利用scrapy框架进行爬虫

    今天一个网友问爬虫知识,自己把许多小细节都忘了,很惭愧,所以这里写一下大概的步骤,主要是自己巩固一下知识,顺便复习一下.(scrapy框架有一个好处,就是可以爬取https的内容) [爬取的是杨子晚报 ...

随机推荐

  1. .NET面试题01-值类型与引用类型

    常见面试题目: 1. 值类型和引用类型的区别? 2. 结构和类的区别? 3. delegate是引用类型还是值类型?enum.int[]和string呢? 4. 堆和栈的区别? 5. 什么情况下会在堆 ...

  2. 基于H5的WebSocket简单实例

    客户端代码: <html> <head> <script> var socket; if ("WebSocket" in window) { v ...

  3. Android Studio(IDEA)快速代码模版使用

    驼峰命名法删除和移动光标快捷键 Android Studio(IDEA)默认没有开启驼峰命名法的删除和移动光标,我们需要设置一下快捷键keymap,按照下面的两张图进行设置 Ctrl+Delete 删 ...

  4. 为什么redis是单线程的?速度还这么快

    为什么说Redis是单线程的? 为什么redis是单线程的?速度还这么快

  5. for循环与forEach性能思考

    今日看到一句话: 基于循环的迭代比基于函数的迭代法快8倍,因此有了该篇验证博客. 验证代码如图: 验证结果:在数量比较少的时候,无明显差别,当数量级达到10的4次方时候,for循环的效率优势明显:如图 ...

  6. Asp.Net中对操作Sql Server 简单处理的SqlDB类

    好久不接触这些闲暇时间回顾一下以前的基础.因为平常使用的时候都是直接调用SqlDB.dll这个类.先看这个类的结构 纸上得来终觉浅,绝知此事要躬行.个人觉得里面的标准操作就是对数据库增删查改 .特别适 ...

  7. HTML空格符号 nbsp; ensp; emsp; 介绍以及实现中文对齐的方法

    一:不同空格符合的区别   半角的不断行的空白格(推荐使用)    半角的空格    全角的空格 详细的含义:  :这是我们使用最多的空格,也就是按下space键产生的空格.在HTML中,如果你用空格 ...

  8. Spring学习之旅(四)Spring工作原理再探

    上篇博文对Spring的工作原理做了个大概的介绍,想看的同学请出门左转.今天详细说几点. (一)Spring IoC容器及其实例化与使用 Spring IoC容器负责Bean的实例化.配置和组装工作有 ...

  9. iOS开发GCD(3)-数据安全

    /* 多个线程可能访问同一块资源,造成数据错乱和数据安全问题 为代码添加同步锁(互斥锁) */ -(void)synchronized{ @synchronized(self){ //需要锁住的代码, ...

  10. 【爬虫】在Xpath中使用正则

    ns = {"re": "http://exslt.org/regular-expressions"} print(html.xpath("//*[r ...