基础知识
爬虫发展史
 
爬虫去重
1. 存储到数据库中

    存取速度慢

2. 存储到内存中的集合里,内存占用十分大

    当爬取数据有1亿条时

        1*10**8*2Byte*50str_len/1024/1024/1024 = 9

    结果显示仅仅爬取1亿条url数据就占用了9个G的内存,显然是不合适的

3. 将url经过md5等哈希方法存储在集合中

    一般一个md5占用128位,16Byte,结果大约为1.5G与上种方法相比,大大减少了内存占用

4. 使用bitmap位图法

    将url经过哈希后的md5值通过hash函数映射到某一位上

    一个url占据一位,同样的一个亿的数据,内存大约占据12M的内存大小。相比与hash方法又占用的内存又小了几个数量级

    这种方法带来的冲突会导致,再寻址

    虽然极大降低了内存占用,但是牺牲了运行时间

5. bloomfilter方法

    对bitmap优化后的方法,减少了hash冲突的可能性
Scrapy入门
介绍
  Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
 
github项目
  https://github.com/scrapy/scrapy
 
scrapy架构
 
新建scrapy工程
# 在虚拟环境中,workon <yourvenvname>

scrapy startproject TestSpider

This will create a tutorial directory with the following contents:
TestSpider/
scrapy.cfg # deploy configuration file TestSpider/ # project's Python module, you'll import your code from here
__init__.py items.py # project items definition file middlewares.py # project middlewares file pipelines.py # project pipelines file settings.py # project settings file spiders/ # a directory where you'll later put your spiders
__init__.py
cd TestSpider scrapy genspider example example.com
简单运行一下工程
# 创建一个main.py文件

    from scrapy.cmdline import execute

    import sys
import os sys.path.append(os.path.dirname(os.path.abspath(__file__)))
execute(["scrapy", "crawl", "jobbole"]) # 在虚拟环境中执行 scrapy crawl jobbole # 或者直接运行我们的main.py文件 *** # 提示缺少模块 pip install pypiwin32 # 配置settings,不遵循OBEY协议 ROBOTSTXT_OBEY = False # 快速调试工程,一次请求,多次测试 scrapy shell <url_path>
 
 
Scrapy内置settings
  • BOT_NAME
    默认: 'scrapybot'
    Scrapy项目实现的bot的名字。用来构造默认 User-Agent,同时也用来log。
    当你使用 startproject 命令创建项目时其也被自动赋值。
  • CONCURRENT_ITEMS
    默认: 100
    Item Processor(即 Item Pipeline) 同时处理(每个response的)item的最大值
  • CONCURRENT_REQUESTS
    默认: 16
    Scrapy downloader 并发请求(concurrent requests)的最大值。
  • CONCURRENT_REQUESTS_PER_DOMAIN
    默认: 8
    对单个网站进行并发请求的最大值。
  • CONCURRENT_REQUESTS_PER_IP
    默认: 0
    对单个IP进行并发请求的最大值。如果非0,则忽略 CONCURRENT_REQUESTS_PER_DOMAIN 设定, 使用该设定。 也就是说,并发限制将针对IP,而不是网站。
    该设定也影响 DOWNLOAD_DELAY: 如果 CONCURRENT_REQUESTS_PER_IP 非0,下载延迟应用在IP而不是网站上。
  • DEFAULT_ITEM_CLASS
    默认: 'scrapy.item.Item'
    the Scrapy shell 中实例化item使用的默认类。
  • DEFAULT_REQUEST_HEADERS
    默认:

    {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'en',
    }

    Scrapy HTTP Request使用的默认header。由 DefaultHeadersMiddleware 产生。

  • DOWNLOADER
    默认: 'scrapy.core.downloader.Downloader'
    用于crawl的downloader.
  • DOWNLOADER_MIDDLEWARES
    默认:: {}
    保存项目中启用的下载中间件及其顺序的字典。
  • DOWNLOAD_DELAY
    默认: 0
    下载器在下载同一个网站下一个页面前需要等待的时间。该选项可以用来限制爬取速度, 减轻服务器压力。同时也支持小数:
  • DOWNLOAD_HANDLERS
    默认: {}
    保存项目中启用的下载处理器(request downloader handler)的字典。
  • DOWNLOAD_TIMEOUT
    默认: 180
    下载器超时时间(单位: 秒)。
  • EXTENSIONS
    默认:{}
    保存项目中启用的插件及其顺序的字典。
  • ITEM_PIPELINES
    默认: {}
    保存项目中启用的pipeline及其顺序的字典。该字典默认为空,值(value)任意。 不过值(value)习惯设定在0-1000范围内。
  • ITEM_PIPELINES_BASE
    默认: {}
    保存项目中默认启用的pipeline的字典。 永远不要在项目中修改该设定,而是修改 ITEM_PIPELINES 。
  • LOG_ENABLED
    默认: True
    是否启用logging。
  • LOG_ENCODING
    默认: 'utf-8'
    logging使用的编码。
  • LOG_FILE
    默认: None
    logging输出的文件名。如果为None,则使用标准错误输出(standard error)。
  • LOG_FORMAT
    默认: '%(asctime)s [%(name)s] %(levelname)s: %(message)s'
    日志的数据格式
  • LOG_DATEFORMAT
    默认: '%Y-%m-%d %H:%M:%S'
    日志的日期格式
  • LOG_LEVEL
    默认: 'DEBUG'
    log的最低级别。可选的级别有: CRITICAL、 ERROR、WARNING、INFO、DEBUG。
  • LOG_STDOUT
    默认: False
    如果为 True ,进程所有的标准输出(及错误)将会被重定向到log中。
  • RANDOMIZE_DOWNLOAD_DELAY
    默认: True
    如果启用,当从相同的网站获取数据时,Scrapy将会等待一个随机的值 (0.5到1.5之间的一个随机值 * DOWNLOAD_DELAY)。
    该随机值降低了crawler被检测到(接着被block)的机会。某些网站会分析请求, 查找请求之间时间的相似性。
  • REDIRECT_MAX_TIMES
    默认: 20
    定义request允许重定向的最大次数。超过该限制后该request直接返回获取到的结果。 对某些任务我们使用Firefox默认值。
  • ROBOTSTXT_OBEY
    默认: False
    是否遵循robots协议
  • SCHEDULER
    默认: 'scrapy.core.scheduler.Scheduler'
    用于爬取的调度器。
  • SPIDER_MIDDLEWARES
    默认: {}
    保存项目中启用的下载中间件及其顺序的字典。
  • USER_AGENT
    默认: "Scrapy/VERSION (+http://scrapy.org)"
    爬取的默认User-Agent,除非被覆盖。

Scrapy学习-1-入门的更多相关文章

  1. Python爬虫Scrapy(二)_入门案例

    本章将从案例开始介绍python scrapy框架,更多内容请参考:python学习指南 入门案例 学习目标 创建一个Scrapy项目 定义提取的结构化数据(Item) 编写爬取网站的Spider并提 ...

  2. python爬虫之Scrapy学习

    在爬虫的路上,学习scrapy是一个必不可少的环节.也许有好多朋友此时此刻也正在接触并学习scrapy,那么很好,我们一起学习.开始接触scrapy的朋友可能会有些疑惑,毕竟是一个框架,上来不知从何学 ...

  3. Scrapy爬虫快速入门

    安装Scrapy Scrapy是一个高级的Python爬虫框架,它不仅包含了爬虫的特性,还可以方便的将爬虫数据保存到csv.json等文件中. 首先我们安装Scrapy. pip install sc ...

  4. Python学习--01入门

    Python学习--01入门 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.和PHP一样,它是后端开发语言. 如果有C语言.PHP语言.JAVA语言等其中一种语言的基础,学习Py ...

  5. [IT学习]sql 入门及实例

    sql 是一种数据库查询语言,可以让你很快的查询到数据.其实一般情况下,你也可以采用excel来查询数据库数据. 但是人们通常认为sql会更加灵活和方便一些. sql学习的入门网站: http://w ...

  6. PHP学习笔记 - 入门篇(5)

    PHP学习笔记 - 入门篇(5) 语言结构语句 顺序结构 eg: <?php $shoesPrice = 49; //鞋子单价 $shoesNum = 1; //鞋子数量 $shoesMoney ...

  7. PHP学习笔记 - 入门篇(4)

    PHP学习笔记 - 入门篇(4) 什么是运算符 PHP运算符一般分为算术运算符.赋值运算符.比较运算符.三元运算符.逻辑运算符.字符串连接运算符.错误控制运算符. PHP中的算术运算符 算术运算符主要 ...

  8. PHP学习笔记 - 入门篇(3)

    PHP学习笔记 - 入门篇(3) 常量 什么是常量 什么是常量?常量可以理解为值不变的量(如圆周率):或者是常量值被定义后,在脚本的其他任何地方都不可以被改变.PHP中的常量分为自定义常量和系统常量 ...

  9. PHP学习笔记--入门篇

    PHP学习笔记--入门篇 一.Echo语句 1.格式 echo是PHP中的输出语句,可以把字符串输出(字符串用双引号括起来) 如下代码 <?php echo "Hello world! ...

  10. Scrapy 爬虫框架入门案例详解

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:崔庆才 Scrapy入门 本篇会通过介绍一个简单的项目,走一遍Scrapy抓取流程,通过这个过程,可以对 ...

随机推荐

  1. android-menudrawer-master 使用

    1. 参照例子写, 运行总崩溃, 多半是导库问题... 2. 既然这样不行, 只好将源码全部拷贝到工程中了. 然后修错误, (将需要的res 文件复制过来.主要是value中的几个文件) 3. 在Ma ...

  2. 如何 Scale Up/Down Deployment?【转】

    伸缩(Scale Up/Down)是指在线增加或减少 Pod 的副本数.Deployment nginx-deployment 初始是两个副本. k8s-node1 和 k8s-node2 上各跑了一 ...

  3. QT +自定义控件-spin+slider

    动手实现自定义控件: 1.首先在ui界面中添加一个(Widget)容器类.如图中的1所示 2.在项目中添加一个SmallWidget类,如下: 3.接着在程序编辑界面进行程序编辑如下: #includ ...

  4. DNA fingerprinting|haplotpe|frequency of polymorphism|限制性标记的多态性

    5.4利用RFLP和SNP绘制遗传图 因为限制性标记可以确定那个分子水平上的突变(即已知基因座),但是无法和蛋白质功能相联系.所以我们采用限制性标记的多态性,即该限制酶识别的位点若发生突变,则大概率在 ...

  5. ios 序列化

    1到底这个序列化有啥作用? 面向对象的程序在运行的时候会创建一个复杂的对象图,经常要以二进制的方法序列化这个对象图,这个过程叫做Archiving. 二进制流可以通过网络或写入文件中(来源于某教材的一 ...

  6. 高德定位腾讯定位在APP上无法开启定位权限的解决方案

    [备注]公司项目中遇到的问题,如果你在团队工作其中定有不少配合方面的问题,其中的思路是可以借鉴的,因为这也许正是你们现在遇到的问题,总结的不好的地方还请多多指教 因为项目需求的确定,定位成了必不可少的 ...

  7. MYSQL数据库SQL语句集锦

    *特别说明:FILED代表数据表字段,CONDITIONS代表where之后的条件,TABLENAME代表数据表名   []中括号内的内容代表 可有可无. 创建数据库 create  database ...

  8. 【Java_基础】Java的访问权限控制

    1.类成员的访问权限控制 Java中类成员的访问权限分为四类:private,无(默认情况下),protected和public.其权限控制如下表所示: 修饰词 本类 同一个包的类 继承类 其他类 p ...

  9. (50)zabbix API二次开发使用与介绍

    zabbix API开发库 zabbix API请求和响应都是json,并且还提供了各种语法的lib库,http://zabbix.org/wiki/Docs/api/libraries,包含php. ...

  10. 一篇关于BEM命名规范

    一直以来自己对命名都是比较混乱的,并没有一个比较好的格式来命名,最近自己碰巧学习到了BEM命名规范,我想谈谈自己的理解以供自己来学习,同时也可以和各位大佬一起学习. BEM是一个很有用的方法可以创建复 ...