zoukankan      html  css  js  c++  java
  • [Python] 爬虫系统与数据处理实战 Part.1 静态网页

    爬虫技术基础

    • HTTP/HTTPS(7层):应用层,浏览器
    • SSL:加密层,传输层、应用层之间
    • TCP/IP(4层):传输层
    • 数据在传输过程中是加密的,浏览器显示的是解密后的数据,对爬虫没有影响
    • 中间人攻击:在传输过程中对数据包进行解析,抓包抓的是IP包,数据是加密的
    • 网页类型
      • 静态网页:HTML,或PHP+JSP后台写HTML
      • 动态网页(前后分离):前端HTML+JavaScript,后端提供数据接口,js请求数据
      • APP内嵌HTML(WebView引擎)
        • 云端下发完整HTML(今日头条)
        • 本地HTML模板+远程数据(微信)
      • 移动端APP(抖音)
        • 反编译APP
    • 爬虫应用
      • 搜索引擎:google
      • 推荐系统:今日头条
      • 社交软件冷启动:探探(爬取新浪微博的数据构造假用户)
      • 自然语言处理的训练集:先从维基爬取信息作为标注的输出结果集,再用google查询结果集作为训练集构建模型
      • 图像训练:训练过滤器(照片、油画、素描),提高搜索准确性
      • 关系分析:天眼查,记录全国所有公司股东信息、关联关系
      • 价格追踪:pricegrabber,比价网站

         

    HTTP

    • 应用层协议
    • 无连接:每次连接只处理一个请求(手机给电脑传数据,传完就拔线;有连接,socket通信,三次握手)
    • 无状态:每次连接、传输都是独立的
    • HEADER(头信息)、body(数据)
    • Request(Client->Server)、Response(Server->Client)
    • Request 的 HTTP Header
      • Charset:编码,Python默认utf-8

      • Encoding:源代码压缩方式,不写不压缩

      • keep-alive:不关闭socket连接

      • User-Agent:客户端类型(手机、电脑打开淘宝网址,会自适应屏幕),爬虫代码中需要伪装成浏览器,通过服务器检查

      • Cookie:服务端response发放给客户端,客户端下次访问时携带方便识别(买了课的用户才能看视频,门票,证件),用于需要登录才能获取数据的网站(微博),登录--获取cookie--设置到header--爬取

    • Request 方法
      • GET:向服务器请求数据,只有header,没有body,安全(不修改服务器数据),抓网页用
      • POST:向服务器发送内容,有header和body,不安全(可能修改服务器数据),抓API用
      • Idempotent:幂等,多次操作结果不变

    •  Response的Header
      • Location:跳转到地址
      • Set-Cookie:服务端给客户端的Cookie
      • Status:状态码,表示请求结果
        • 2XX:成功
        • 3XX:跳转(302:重定向,urllib2库会对重定向做处理,实现自动跳转)
        • 4XX:客户端错误(401:未授权,403:拒绝提供服务,404:资源不存在)
        • 5XX:服务器错误(500:服务器未知错误,503:服务器不能处理请求)
      • 错误处理
        • 400:Bad Request,检查请求的参数或路径
        • 401:Unauthorized,需授权的网页的Cookie到期,尝试重新登录
        • 403:Forbidden,需要登录的网站,尝试重新登录;IP被封,暂定爬取,增加爬虫等待时间 
        • 404:Not Found,直接丢弃
        • 5XX:直接丢弃,并计数,如连续不成功,停止爬取

    CSS

    • class、id可帮助定位爬取内容

    DOM树

    • 通过路径找到内容

    JavaScript

    • 动态网页:如京东,价格信息通过js动态请求然后渲染,不能通过直接下载HTML获取信息
    • 通过AJAX接口爬取,可能更简单

    爬取原理

    • 网页间通过<a>构成网页树
    • 宽度优先:把孩子节点放入队列
    • 深度优先

    •  选取原则
      • 重要网页距种子站点较近
      • 万维网的深度并没有很深(<=17层),一个网页有很多路径可以到达
      • 宽度优先有利于多爬虫合作爬取
      • 深度限制与宽度优先结合(深度到达关注网页,再宽度抓取)
      • 类比:学的深还是学的专?创业办某领域小公司还是平台型公司
      • 深度优先注意限制层数,否则不会停

    如何记录抓取历史

    • 不重复抓取策略:记录已抓取网页,避免重复访问
    • 如已经爬取了10w网页,又来了1个新网页,如何判断它是否在保存的10w个网页当中[爬虫陷阱]
    • 保存在数据库中,效率较低(几十万以下可用)
    • 用HashSet将访问的URL保存,只需O(1)代价就可查到是否访问过,消耗内存(URL可能很长)
      • URL经MD5(都是16字节)或SHA-1等单向哈希后再保存到HashSet或数据库
      • Java的HashTable是一个Hash表再跟一个链表,链表中保存碰撞结果
    • Bit-Map方法,建立一个BitSet,将每个URL经哈希函数映射到某一BIT
      • Bloom Filter:使用了多个哈希函数映射URL,减少碰撞,提高空间利用率,只能插入不能删除
      • pip install murmurhash3 bitarray
      • pip install pybloomfilter

     

     如何提高效率

    • 评估网站数量
      • site:www.mafengwo.cn
    • 选择合适HASH算法和空间阈值,降低碰撞几率
    • 选择合适的存储结构和算法

    总结

    • 多数情况不需要压缩,尤其网页数量少的情况
    • 网页数量大的情况,使用Bloom Filter压缩
    • 重点是验算碰撞概率,并根据碰撞概率来确定存储空间的阈值
    • 分布式系统,将散列映射到多台主机的内存
  • 相关阅读:
    移动平台的meta标签-----神奇的功效
    JAVA工程命名规范
    linux 查看tomcat 实时日志
    linux 配置全局jdk环境
    AJAX 前后端交互 验证信息是否正确
    数据库更新DATE类型的时间
    jq 克隆 移除table
    eclipse 安装javaEE插件 和htmlxmljsp编辑器
    oracle 正序 逆序 排序查询
    JQ遍历 input 并修改name属性
  • 原文地址:https://www.cnblogs.com/cxc1357/p/12496896.html
Copyright © 2011-2022 走看看