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函数降低冲突

  • 相关阅读:
    LeetCode 264. Ugly Number II
    LeetCode 231. Power of Two
    LeetCode 263. Ugly Number
    LeetCode 136. Single Number
    LeetCode 69. Sqrt(x)
    LeetCode 66. Plus One
    LeetCode 70. Climbing Stairs
    LeetCode 628. Maximum Product of Three Numbers
    Leetcode 13. Roman to Integer
    大二暑假周进度报告03
  • 原文地址:https://www.cnblogs.com/ruoniao/p/6849600.html
Copyright © 2011-2022 走看看