Scrapy 框架 总结

news/2024/7/19 12:14:17 标签: python, 爬虫, 数据结构与算法

总结:

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 配置
python"># 开启自动限速设定:
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 框架的自定义命令文件

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

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

scrapy_redis 实现深度优先 广度优先

python">'''
通俗的讲:
深度优先:一个一个节点往下找,不找兄弟节点,每一个深度一个节点,先进去的后出来
广度优先:横向取值,一个节点有关联其他的节点,一同被取出来,一个深度多个节点,先进去的先出来
'''
# 在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出来
深度优先类似,就不多说了

转载于:https://www.cnblogs.com/zhang-zi-yi/p/10749457.html


http://www.niftyadmin.cn/n/1147386.html

相关文章

java学习笔记10-方法

我们经常用到System.out.println(),它到底是什么? System是系统类 out是系统类的标准输出对象 println()是一个方法 也就是说是调用了System类中的标准输出对象out的println()方法 方法是为了实现某个功能而编写的一系列代码的集合 定义方法的语法是&…

诺基亚:08年售3500万部GPS手机 转型IT公司

5月9日消息,诺基亚首席执行官康培凯周四表示,预计公司年内将销售3500万部配置GPS全球定位系统功能的手机。 据国外媒体报道,康培凯在公司年度股东大会上表示:“预计公司2008年将出售3500万部GPS手机,这一数字与2007年…

opencv笔记(2):图像剪切和图像移位

生活就像大海,我就像一条咸鱼,在浩瀚的海洋中边浪边学,这是opencv笔记系列中的「图像剪切」和「图像移位」。更多可关注「浪学」公众 ~ 世间万图,皆可剪切和移位。这一篇以很咸鱼的方式把它们记录下来。 首先载入图像 import cv2 …

IBM推“赛道”存储器 传统硬盘将下岗

传统硬盘目前仍是主流的储存手段,不过有着耗电量高、不耐震和存在运转嘈杂的缺点。传统硬盘的创始者IBM公司最近宣布,他们将在10年内采用最新技术,开发出一种“赛道”存储器来取代传统硬盘。这种新型存储器比传统硬盘更小、更轻,且…

贝壳金服 TiDB 在线跨机房迁移实践

2019独角兽企业重金招聘Python工程师标准>>> 作者介绍 : 李振环,贝壳金服数据基础架构负责人,目前负责数据平台和企业级数据仓库开发。 公司介绍 贝壳金服是专注居住场景的金融科技服务商,起步于2006年成立的链家金融事…

Gitea 1.8.0 发布,组织可设置为公开、内部与私有状态

开发四年只会写业务代码,分布式高并发都不会还做程序员? Gitea 1.8.0 发布了,此版本包含两个新的安全修复程序,无法向后移植到 1.7.0 分支,建议更新到此版本。 1.8.0 共合并了 245 个 PR,更新亮点包括&am…

支付宝用户已超8000万 年内有望突破1亿

昨日,支付宝网络技术有限公司宣布,支付宝注册用户已经突破8000万,艾瑞分析师张艳平预测年内将突破1亿。记者从支付宝方面了解到,外部商户数量的不断扩张是用户激增的主要原因。 信产部4月公布的数据显示,截至2008年2…

MSSQL-最佳实践-Always Encrypted

title: MSSQL - 最佳实践 - Always Encrypted author: 风移 摘要 在SQL Server安全系列专题月报分享中,往期我们已经陆续分享了:如何使用对称密钥实现SQL Server列加密技术、使用非对称密钥实现SQL Server列加密、使用混合密钥实现SQL Server列加密技术、…