网络爬虫直播观看总结(掘金直播第十期)

前言

第一次完整看了一次技术直播,静距离地接触到了崔庆才老师,正是他的网易课程让我入了爬虫的门,成功地开发爬虫爬取到了想要的数据,体验了数据抓取的乐趣。借此良机,在这里我想简单总结整理一下我所学到的以及这次直播听到的关于爬虫的所有知识,有什么地方不够准确,欢迎大家指正,相互学习。(哭,在崔神写完之后发布,压力很大的,参考部分不少,毕竟主要按崔神思路来写的,崔神分享链接:juejin.im/post/5bce82…

文章分为六部分,按照崔老师的思路讲下去,同时穿插个人补充

  • 爬取
  • 解析
  • 存储
  • 框架scrapy
  • 防反爬
  • 加速

爬取

这一部分主要讲的是怎么才能拿到想要的数据源

爬取类型

主要分为两种:

  • 服务端渲染(页面结果是由服务器渲染后返回的,有效信息包含在请求直接返回的HTML页面中)

《网络爬虫直播观看总结(掘金直播第十期)》

  • 客户端渲染(页面结果由JavaScript渲染而成,html 仅仅作为静态文件,客户端在请求时,服务端不做任何处理,直接以原文件的形式返回给客户端,然后根据 html 上的 JavaScript,生成 DOM 插入 html显示数据)

《网络爬虫直播观看总结(掘金直播第十期)》

针对不同类型,解决方法自然不同

服务端渲染类型解决方法

对于第一种服务端渲染类型,直接通过各种库请求拿到HTML页面即可(数据在HTML页面上) 这里列举如下库可做参考研究深入:

  • urllib(Python自带的原生底层库)
  • urllib3(相比urllib增加很多新特性和功能)
  • pycurl(libcurl的Python实现)
  • hyper(支持HTTP2的新特性)
  • requests(应用最广泛的HTTP请求库,推荐)
  • grab(基于urllib3和PyQuery封装)

客户端渲染类型解决方法

此种情形一般是用第一种方法无法请求查看到想要抓取的数据,采用以下四种方法

  • 寻找Ajax请求

AJAX 是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。有很多使用 AJAX的应用程序案例:新浪微博、Google 地图、开心网等等。

解决方法:

直接使用 Chrome/Firefox 的开发者工具直接查看 Ajax 具体的请求方式、参数等内容,然后用 HTTP 请求库模拟即可

另外还可以通过设置代理抓包来查看接口,如 Fiddler/Charles

  • 模拟浏览器执行

适用于网页接口和逻辑较复杂的情况

使用 Selenium、Splinter、Spynner、pyppeteer、PhantomJS、Splash、requests-html 等来实现

  • 直接提取JavaScript数据

此种情况数据隐藏在JavaSript变量中,直接利用正则表达式等方式提取解析即可

  • 模拟执行JavaScript

直接模拟浏览器执行效率低,可以通过执行JavaScript完成数据获取,通过Selenium、PyExecJS、PyV8、js2py 等库帮助完成

APP数据爬取

  • 普通接口 直接请求

抓取HTTP/HTTPS数据包,利用 Charles、Fiddler、mitmproxy软件

  • 加密参数接口

接口的参数经过加密,每次请求有随机生成的token 一是可以实时处理,利用 Fiddler、mitmdump、Xposed 等,其次可以是将加密逻辑破解,直接模拟构造规则即可,还可以直接反编译破解。

  • 加密内容接口

接口返回结果经过加密

1.利用Appium,可见即可爬,类似Selenium 2.Xposed 使用hook来获取结果 3.反编译 找出使用的加密算法,模拟即可 4.改写手机底层操作系统源码

  • 非常规协议

利用WireShark抓取所有协议包 利用Tcpdunp抓取TCP数据包

数据解析

数据源拿到了,很多地方无用信息太多,需要我们进一步进行数据清洗加工

  • HTML页面数据 利用四大种数据解析方法,(在相应的库中都会提供),Xpath,CSS,正则表达式,Selector,这些解析都有各自的解析规则,每个拿些例子用用就记住会用了,推荐用Xpath

  • 其他类型 对于接口返回的json,xml类型,直接用json,xml2dict库处理即可

以上解析都是每次爬取一个网页数据,就要重新构造数据解析规则,甚是繁琐麻烦,如果数据量不大,自己复制粘贴都比较方便,那样有没有一种方法解决这个问题呢

机器学习大展身手的今天,爬虫领域也有它的身影。于是有了智能解析!

下面分为四个方法进行了划分:

  • readability算法,这个算法定义了不同区块的不同标注集合,通过权重计算来得到最可能的区块位置。
  • 疏密度判断,计算单位个数区块内的平均文本内容长度,根据疏密程度来大致区分。
  • Scrapyly 自学习,是 Scrapy开发的组件,指定⻚页⾯面和提取结果样例例,其可自学习提取规则,提取其他同类页⾯。
  • 深度学习,使⽤用深度学习来对解析位置进⾏有监督学习,需要⼤量标注数据。

当然现在机器学习算法的准确率还不能达到100%,会有数据出错,水比较深

存储

数据解析下来后,数据就得存储起来,可以作为数据挖掘和机器学习的数据源,这里说一下常见的存储方式

  • 文件 如 JSON、CSV、TXT、图⽚、视频、⾳频等
  • 数据库,分为关系型数据库、非关系型数据库,如 MySQL、MongoDB、HBase 等
  • 搜索引擎,如 Solr、ElasticSearch 等,便于检索和实现⽂本匹配
  • 云存储,某些媒体文件可以存到如七⽜牛云、又拍云、阿里云、腾讯云、Amazon S3 等

框架

从请求数据源到清洗解析数据,最后到存储,这个爬虫的基本三部就这样结束了,用python的各种库,是不是觉得很乱,下面我就简单说说关于爬虫的框架,这些开源的爬虫框架把复杂的问题解决掉,然后封装,提供各种类函数让我们用的很简单、方便,不必考虑那些URL去重、代理、线程池管理等等问题,每次开发只需要着重考虑抓取逻辑,但是想入手框架,有一定门槛,建议看看源码,多想想他们的设计思想以及实现逻辑。

《网络爬虫直播观看总结(掘金直播第十期)》 以上是一些常用框架的对比图,没有绝对的好坏,不同的框架需求点不同

最近学习了scrapy框架,因此在这里总结一下主要的逻辑图,不细说 先上逻辑图

《网络爬虫直播观看总结(掘金直播第十期)》 主要的逻辑步骤八步(由标号1开始到8):

  • 首先第一次通过start_url设置爬取首页面,调用内置的start_request方法发起requests请求交给爬虫引擎ENGINE处理
  • ENGINE交给SCHEDULER调度器处理
  • 调度器队列调度发起requests请求
  • 由调度器发起的requests请求ENGINE将其交给DOWNLOADER请求下载网页
  • 请求返回response结果交给ENGINE
  • ENGINE将请求返回的response交给spider解析
  • spider解析返回数据清洗整理成的items项,并解析其中页面可能含有的新链接生成requests,同样交至ENGINE
  • ENGINE将items项交给ITEM PIPELINES存储,requests交给调度器调度

以上便是主要scrapy框架逻辑,其中MIDDLEWARE称为中间件,分为downloader middleware(用以另外处理requests和response对象)和spider middleware(一个Scrapy的spider处理机制的钩子框架,你可以插入自定义的功能用来处理engine发往spider的response和spider发往engine的request和item)

scrapy框架博大精深,持续挖掘中。。。。。

反爬

随着公司对自己数据的保护意识不断提高,现在很多小公司网站都已经添加反爬检测,爬虫可以说是越来越不容易

防爬方式有非浏览器检测,封IP,封账号,字体反爬等

封ip,账号

爬久了会拒绝服务请求,可通过交替更换ip爬取,用代理解决,可以分为几种情况来处理:

  • 首先寻找手机站点、App 站点,如果存在此类站点,反爬会相对较弱,先找软柿子下手嘛。
  • 使用代理,如抓取免费代理、购买付费 Tor 代理、Socks 代理等。
  • 在代理的基础上维护自己的代理池,防止代理浪费,保证实时可用。
  • 搭建 ADSL 拨号代理,稳定高效。
  • 寻找无登录接口,尽可能寻找⽆无需登录即可爬取的接口。
  • 维护 Cookies 池,使⽤用批量账号模拟登录,使⽤时随机挑选可用 Cookies 使⽤即可

验证码

  • 普通图形验证码,如果非常规整且没有变形或干扰,可以使用 OCR 识别,也可以使用机器学习方面图片识别来模型训练,当然打码平台是最方便的方式。
  • 对于算术题验证码,推荐直接使用打码平台。
  • 对于滑动验证码,可以使用破解算法,也可以模拟滑动(模拟真人拖动规律先是加速滑动后减速)。后者的关键在于缺口的找寻,可以使用图片比对,也可以写基本的图形识别算法,也可以对接打码平台,也可以使用深度学习训练识别接口。
  • 对于点触验证码,推荐使用打码平台。对于手机验证码,可以使用验证码分发平台,也可以购买专门的收码设备,也可以人工验证
  • 对于扫二维码,可以人工扫码,也可以对接打码平台。

加速

数据量大时候,高效快速爬取是当下的关键问题

  • 多进程,多线程
  • 异步
  • 分布式
  • 优化
  • 架构

最后捧上崔神总结的脑图,致敬崔神!

《网络爬虫直播观看总结(掘金直播第十期)》

最后我想说一下自己的感受,当初学爬虫就是为了爬取数据自动化生成表格,解决生活中的繁杂重复无意义的事,机缘巧合竟在其中寻找到了一些乐趣成就感,深入学习了不少,想把爬虫作为以后的主要方向,但随着我不断地了解认识到如今爬虫的前景不是特别明朗,然后由于很多方面原因吧,也是参考崔神建议,最终决定把爬虫作为兴趣作为一个支线带着做一做,会一如既往地继续学习研究下去,因为我知道抓取大量数据那种成就感是货真价实,是无关乎任何外界因素的个人,所有如果大家也有同样的纠结疑虑,希望我的分享可以给你一些参考,没事的时候,让我们抛下一切,回归当初学爬虫的心态,多爬爬数据,感受其中的魅力。

    原文作者:算法小白
    原文地址: https://juejin.im/post/5bcdefe86fb9a05d122845e2
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞