zoukankan      html  css  js  c++  java
  • Scrapy基础(一) ------学习Scrapy之前所要了解的

    技术选型:    

    Scrapy vs requsts+beautifulsoup
        1,reqests,beautifulsoup都是库,Scrapy是框架
        2,Scrapy中可以加入requests beautifulsoup
        3,Scrapy基于twisted,异步IO框架,性能最大的优势
        4,Scrapy 扩展方便,提供了许多内置功能
        5,内置css和xpath selector(都是c写的)非常方便,beautifulsoup(是纯python写的缺点就是慢)

    网页分类 

        1,静态网页
        2,动态页面
        3,webservice(restapi)

    爬虫能做什么    

       

        1,搜索引擎,百度google,垂直领域的搜索引擎
        2,推荐引擎,--今日头条
        3,机器学习的数据样本
        4,数据分析,金融分析

    正则表达式   

      1,为什么学习

            精细化提取
        2,基础内容
            特殊字符
                1)
                  ^:^b 必须以b开头
                  . : 代表任意字符
                  * :前面出现的字符任意多次    
                  $ : b$ 必须以b结尾的
                  ? :非贪婪匹配模式,尽量少的匹配
                  + :前面出现的字符出现(1,+00)
                  {2} : 前面的字符出现了两次
                  {3,}:前面的字符出现了最少3次
                  {2,5} : 前面的字符出现了2-5次
                    |   : 数线 或的关系,先提取前面的
                2)   
                  []  :  [abc] 从abc中都选一个都可以;[0-9a-Z]区间;[.]进入[]中的.*等没特殊意义;
                          [^1] 排除1的都可以匹配
                  手机号: "1[48357][0-9]{9}"

                3)
                  s : 空格
                  S : 只要不是空格就匹配了
                  w : 等价于[a-zA-Z0-9_]
                  W : 除了[a-zA-Z0-9_]都匹配

                4)
                   [u4E00-u9FA5] :值提取中文
                   d  : 数字


    体会一下非贪婪匹配:
        匹配boooobby 中的boooob


    1 import re
    2 a = "aaboooobby123"
    3 match_obj = re.match(".*?(b.*?b).*",a)
    4 if match_obj:
    5     print(match_obj.group(1)) #输出匹配子串1
    6 #  ".*(b.*b).*"   -->  bb   贪婪匹配,从左边开始匹配或者
    7 #说从右边开始找到最后一个符合条件的
    8 #  ".*?(b.*b).*"  -->  boooobb 括号中是贪婪匹配,直至找到最后一个b
    9 #".*?(b.*?b).*"   -->  boooob  都是非贪婪匹配

    网站的深度优先和广度优先        

      深度优先:

        对于二叉树,先考虑一边,往深了寻找
            Scrapy 默认也是深度优先,递归算法实现
        
         广度优先:

        优先兄弟节点而不是子节点;按每层遍历
            通过队列形式实现

    URL去重:    

    1,将URL报存到数据库,麻烦,慢    2,保存到set中,只需要O(1)代价就能查询URL
        但是:一亿 100000000*2byte*50个字符/1024/1024=9G
        小型爬虫一亿不多
        3,url 经过md5等方法哈希后保存到set中
        Scrapy采用的就是此;可将字符缩短到固定一般长度16个byte
        4,bitmap方法将访问的URL通过hash函数映射到某一位
        缺点:冲突可能性较大
        5,bloomfilter方法对bitmap进行改进,多重hash函数降低冲突

  • 相关阅读:
    【转】[fix] Wireshark error: There are no interfaces on which a capture can be done. on Mac OS X
    【转载】Linux 文件系统的目录结构
    postgreSQL使用
    [转载] Linux启动过程详解-《别怕Linux编程》之八
    冒泡排序
    java值类型和引用类型
    冒泡排序法与二分查找法
    关系型数据库
    SQList的建表并添加数据练习
    数据存储——SQLite数据库存储
  • 原文地址:https://www.cnblogs.com/ruoniao/p/6849600.html
Copyright © 2011-2022 走看看