爬虫技术基础

  • 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压缩
  • 重点是验算碰撞概率,并根据碰撞概率来确定存储空间的阈值
  • 分布式系统,将散列映射到多台主机的内存

[Python] 爬虫系统与数据处理实战 Part.1 静态网页的更多相关文章

  1. Python爬虫开发与项目实战

    Python爬虫开发与项目实战(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1MFexF6S4No_FtC5U2GCKqQ 提取码:gtz1 复制这段内容后打开百度 ...

  2. Python爬虫开发与项目实战pdf电子书|网盘链接带提取码直接提取|

    Python爬虫开发与项目实战从基本的爬虫原理开始讲解,通过介绍Pthyon编程语言与HTML基础知识引领读者入门,之后根据当前风起云涌的云计算.大数据热潮,重点讲述了云计算的相关内容及其在爬虫中的应 ...

  3. Python爬虫的概括以及实战

    第一章主要讲解爬虫相关的知识如:http.网页.爬虫法律等,让大家对爬虫有了一个比较完善的了解和一些题外的知识点.​ 今天这篇文章将是我们第二章的第一篇,我们从今天开始就正式进入实战阶段,后面将会有更 ...

  4. Python爬虫系统学习(1)

    Python爬虫系统化学习(1) 前言:爬虫的学习对生活中很多事情都很有帮助,比如买房的时候爬取房价,爬取影评之类的,学习爬虫也是在提升对Python的掌握,所以我准备用2-3周的晚上时间,提升自己对 ...

  5. python爬虫抓取哈尔滨天气信息(静态爬虫)

    python 爬虫 爬取哈尔滨天气信息 - http://www.weather.com.cn/weather/101050101.shtml 环境: windows7 python3.4(pip i ...

  6. 如何让Python爬虫一天抓取100万张网页

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 王平 源自:猿人学Python PS:如有需要Python学习资料的 ...

  7. Python爬虫学习三------requests+BeautifulSoup爬取简单网页

    第一次第一次用MarkDown来写博客,先试试效果吧! 昨天2018俄罗斯世界杯拉开了大幕,作为一个伪球迷,当然也得为世界杯做出一点贡献啦. 于是今天就编写了一个爬虫程序将腾讯新闻下世界杯专题的相关新 ...

  8. Python爬虫:为什么你爬取不到网页数据

    前言: 之前小编写了一篇关于爬虫为什么爬取不到数据文章(文章链接为:Python爬虫经常爬不到数据,或许你可以看一下小编的这篇文章), 但是当时小编也是胡乱编写的,其实里面有很多问题的,现在小编重新发 ...

  9. python爬虫入门新手向实战 - 爬取猫眼电影Top100排行榜

    本次主要爬取Top100电影榜单的电影名.主演和上映时间, 同时保存为excel表个形式, 其他相似榜单也都可以依葫芦画瓢 首先打开要爬取的网址https://maoyan.com/board/4, ...

随机推荐

  1. Java中的三大特性 - 超详细篇

    前言 大家好啊,我是汤圆,今天给大家带来的是<Java中的三大特性 - 超详细篇>,希望对大家有帮助,谢谢 这一节的内容可能有点多,大家可以选择性的来看 简介 Java的三大特性:封装.继 ...

  2. 幻灯片放映模式切换windows terminal背景图片

    目录 幻灯片放映模式切换windows terminal背景图片 脚本功能 开发需求 使用技术 操作说明 使用示例 查看帮助 输入参数使用 脚本详情 引用参考 幻灯片放映模式切换windows ter ...

  3. 字符串函数的实现(三)之strcat

    C语言中的字符串函数有如下这些 获取字符串长度 strlen 长度不受限制的字符串函数 strcpy strcat strcmp 长度受限制的字符串函数 strncpy strncat strncmp ...

  4. 解决SQLPLUS无法使用上下箭头

    1 问题描述 SQLPLUS中使用上下箭头无法获取历史命令,如下图所示: 按上下箭头会显示^[[A/^[[B. 2 解决方案 需要安装rlwrap,可以的话可以用包管理器安装,笔者环境CentOS,这 ...

  5. Typora+PicGo+阿里云写博客笔记

    Typora+PicGo+阿里云写博客笔记 选择这三个工具的理由 我一直有在使用typora使用mardown写作,毕竟typora很香,可以实时预览,非常丝滑. 配合上PicGo这个图床工具简直绝了 ...

  6. SpringBoot 启动慢?那是因为你不知道它

    前言 在 2021 年这个小学作文中的未来年份,没有想象中的汽车满天飞,也没有实现机器人满地跑.但牛逼的是我们都有一个共识: 知乎达到了人均 "谢邀~ 人在美国刚下飞机"的生活水平 ...

  7. centos7安装kubernetes k8s 1.16

    #初始化服务器 echo 'export LC_ALL="en_US.UTF-8"' >> /etc/profile source /etc/profile #!/bi ...

  8. 【布隆过滤器】基于Hutool库实现的布隆过滤器Demo

    布隆过滤器出现的背景: 如果想判断一个元素是不是在一个集合里,一般想到的是将集合中所有元素保存起来,然后通过比较确定.链表.树.散列表(又叫哈希表,Hash table)等等数据结构都是这种思路,存储 ...

  9. 《机器学习Python实现_10_09_集成学习_bagging_stacking原理及实现》

    介绍 前面对模型的组合主要用了两种方式: (1)一种是平均/投票: (2)另外一种是加权平均/投票: 所以,我们有时就会陷入纠结,是平均的好,还是加权的好,那如果是加权,权重又该如何分配的好?如果我们 ...

  10. POJ 1679 判断最小树是否唯一

    题意:       给你一个图,问你最小树是否唯一,唯一则输出最小数的权值,不唯一输出Not Unique! 思路:      题目问的是最小树是否唯一,其实也就是在问次小树是否等于最小树,如果等于则 ...