转载自公众号:进击的Coder:

昨天的时候我参加了掘金组织的一场 Python 网络爬虫主题的分享活动,主要以直播的形式分享了我从事网络爬虫相关研究以来的一些经验总结,整个直播从昨天下午 1 点一直持续到下午 5 点,整整四个小时。

整个分享分为三个阶段,第一阶段先介绍了自己从大学以来从事编程开发以来的相关历程,第二阶段是正式的网络爬虫分享流程,详细总结了网络爬虫开发的一些要点,第三阶段是解答一些提问,并抽奖送出一些礼品。所以在这里我会对我昨天分享的主要内容做下总结,另外还会附上视频回放、PPT,另外还会为大家送上一些福利,希望大家可以支持!

总括

整个分享的主题叫做《健壮高效的网络爬虫》,本次分享从抓取、解析、存储、反爬、加速五个方面介绍了利用 Python 进行网络爬虫开发的相关知识点和技巧,介绍了不同场景下如何采取不同措施高效地进行数据抓取的方法,包括 Web 抓取、App 抓取、数据存储、代理选购、验证码破解、分布式抓取及管理、智能解析等多方面的内容,另外还结合了不同场景介绍了常用的一些工具包,全部内容是我在从事网络爬虫研究过程以来的经验精华总结。

爬取

对于爬取来说,我们需要学会使用不同的方法来应对不同情景下的数据抓取任务。

爬取的目标绝大多数情况下要么是网页,要么是 App,所以这里就分为这两个大类别来进行了介绍。

对于网页来说,我又将其划分为了两种类别,即服务端渲染和客户端渲染,对于 App 来说,我又针对接口的形式进行了四种类别的划分——普通接口、加密参数接口、加密内容接口、非常规协议接口。

所以整个大纲是这样子的:

  • 网页爬取

    • 服务端渲染

    • 客户端渲染

  • App 爬取

    • 普通接口

    • 加密参数接口

    • 加密内容接口

    • 非常规协议接口

爬取 / 网页爬取

服务端渲染的意思就是页面的结果是由服务器渲染后返回的,有效信息包含在请求的 HTML 页面里面,比如猫眼电影这个站点。客户端渲染的意思就是页面的主要内容由 JavaScript 渲染而成,真实的数据是通过 Ajax 接口等形式获取的,比如淘宝、微博手机版等等站点。

服务端渲染的情况就比较简单了,用一些基本的 HTTP 请求库就可以实现爬取,如 urllib、urllib3、pycurl、hyper、requests、grab 等框架,其中应用最多的可能就是 requests  了。

对于客户端渲染,这里我又划分了四个处理方法:

  • 寻找 Ajax 接口,此种情形可以直接使用 Chrome/Firefox 的开发者工具直接查看 Ajax 具体的请求方式、参数等内容,然后用 HTTP 请求库模拟即可,另外还可以通过设置代理抓包来查看接口,如 Fiddler/Charles。

  • 模拟浏览器执行,此种情形适用于网页接口和逻辑较为复杂的情况,可以直接以可见即可爬的方式进行爬取,如可以使用 Selenium、Splinter、Spynner、pyppeteer、PhantomJS、Splash、requests-html 等来实现。

  • 直接提取 JavaScript 数据,此种情形适用于真实数据没有经过 Ajax 接口获取,而是直接包含在 HTML 结果的某个变量中,直接使用正则表达式将其提取即可。

  • 模拟执行 JavaScript,某些情况下直接模拟浏览器执行效率会偏低,如果我们把 JavaScript 的某些执行和加密逻辑摸清楚了,可以直接执行相关的 JavaScript 来完成逻辑处理和接口请求,比如使用 Selenium、PyExecJS、PyV8、js2py 等库来完成即可。

爬取 / App 爬取

对于 App 的爬取,这里分了四个处理情况:

  • 对于普通无加密接口,这种直接抓包拿到接口的具体请求形式就好了,可用的抓包工具有 Charles、Fiddler、mitmproxy。

  • 对于加密参数的接口,一种方法可以实时处理,例如 Fiddler、mitmdump、Xposed 等,另一种方法是将加密逻辑破解,直接模拟构造即可,可能需要一些反编译的技巧。

  • 对于加密内容的接口,即接口返回结果完全看不懂是什么东西,可以使用可见即可爬的工具 Appium,也可以使用 Xposed 来 hook 获取渲染结果,也可以通过反编译和改写手机底层来实现破解。

  • 对于非常规协议,可以使用 Wireshark 来抓取所有协议的包,或者使用 Tcpdump 来进行 TCP 数据包截获。

以上便是爬取流程的相关分类和对应的处理方法。

解析

对于解析来说,对于 HTML 类型的页面来说,常用的解析方法其实无非那么几种,正则、XPath、CSS Selector,另外对于某些接口,常见的可能就是 JSON、XML 类型,使用对应的库进行处理即可。

这些规则和解析方法其实写起来是很繁琐的,如果我们要爬上万个网站,如果每个网站都去写对应的规则,那么不就太累了吗?所以智能解析便是一个需求。

智能解析意思就是说,如果能提供一个页面,算法可以自动来提取页面的标题、正文、日期等内容,同时把无用的信息给刨除,例如上图,这是 Safari 中自带的阅读模式自动解析的结果。

对于智能解析,下面分为四个方法进行了划分:

  • readability 算法,这个算法定义了不同区块的不同标注集合,通过权重计算来得到最可能的区块位置。

  • 疏密度判断,计算单位个数区块内的平均文本内容长度,根据疏密程度来大致区分。

  • Scrapyly 自学习,是 Scrapy 开发的组件,指定⻚页⾯面和提取结果样例例,其可⾃自学习提取规则,提取其他同类⻚页⾯面。

  • 深度学习,使⽤用深度学习来对解析位置进⾏行行有监督学习,需要⼤大量量标注数据。

如果能够容忍一定的错误率,可以使用智能解析来大大节省时间。

目前这部分内容我也还在探索中,准确率有待继续提高。

存储

存储,即选用合适的存储媒介来存储爬取到的结果,这里还是分为四种存储方式来进行介绍。

  • 文件,如 JSON、CSV、TXT、图⽚、视频、⾳频等,常用的一些库有 csv、xlwt、json、pandas、pickle、python-docx 等。

  • 数据库,分为关系型数据库、非关系型数据库,如 MySQL、MongoDB、HBase 等,常用的库有 pymysql、pymssql、redis-py、pymongo、py2neo、thrift。

  • 搜索引擎,如 Solr、ElasticSearch 等,便于检索和实现⽂本匹配,常用的库有 elasticsearch、pysolr 等。

  • 云存储,某些媒体文件可以存到如七⽜牛云、又拍云、阿里云、腾讯云、Amazon S3 等,常用的库有 qiniu、upyun、boto、azure-storage、google-cloud-storage 等。

这部分的关键在于和实际业务相结合,看看选用哪种方式更可以应对业务需求。

反爬

反爬这部分是个重点,爬虫现在已经越来越难了,非常多的网站已经添加了各种反爬措施,在这里可以分为非浏览器检测、封 IP、验证码、封账号、字体反爬等。

下面主要从封 IP、验证码、封账号三个方面来阐述反爬的处理手段。

反爬 / 封 IP

对于封 IP 的情况,可以分为几种情况来处理:

  • 首先寻找手机站点、App 站点,如果存在此类站点,反爬会相对较弱。

  • 使用代理,如抓取免费代理、购买付费代理、使用 Tor 代理、Socks 代理等。

  • 在代理的基础上维护自己的代理池,防止代理浪费,保证实时可用。

  • 搭建 ADSL 拨号代理,稳定高效。

反爬 / 验证码

验证码分为非常多种,如普通图形验证码、算术题验证码、滑动验证码、点触验证码、手机验证码、扫二维码等。

  • 对于普通图形验证码,如果非常规整且没有变形或干扰,可以使用 OCR 识别,也可以使用机器学习、深度学习来进行模型训练,当然打码平台是最方便的方式。

  • 对于算术题验证码,推荐直接使用打码平台。

  • 对于滑动验证码,可以使用破解算法,也可以模拟滑动。后者的关键在于缺口的找寻,可以使用图片比对,也可以写基本的图形识别算法,也可以对接打码平台,也可以使用深度学习训练识别接口。

  • 对于点触验证码,推荐使用打码平台。

  • 对于手机验证码,可以使用验证码分发平台,也可以购买专门的收码设备,也可以人工验证。

  • 对于扫二维码,可以人工扫码,也可以对接打码平台。

反爬 / 封账号

某些网站需要登录才能爬取,但是一个账号登录之后请求过于频繁会被封号,为了避免封号,可以采取如下措施:

  • 寻找手机站点或 App 站点,此种类别通常是接口形式,校验较弱。

  • 寻找无登录接口,尽可能寻找⽆无需登录即可爬取的接口。

  • 维护 Cookies 池,使⽤用批量账号模拟登录,使⽤时随机挑选可用 Cookies 使⽤即可,实现:https://github.com/Python3WebSpider/CookiesPool。

加速

当爬取的数据量非常大时,如何高效快速地进行数据抓取是关键。

常见的措施有多线程、多进程、异步、分布式、细节优化等。

加速 / 多线程、多进程

爬虫是网络请求密集型任务,所以使用多进程和多线程可以大大提高抓取效率,如使用 threading、multiprocessing 等。

加速 / 异步

将爬取过程改成非阻塞形式,当有响应式再进行处理,否则在等待时间内可以运行其他任务,如使用 asyncio、aiohttp、Tornado、Twisted、gevent、grequests、pyppeteer、pyspider、Scrapy 等。

加速 / 分布式

分布式的关键在于共享爬取队列,可以使用 celery、huey、rq、rabbitmq、kafka 等来实现任务队列的对接,也可以使用现成的框架 pyspider、Scrapy-Redis、Scrapy-Cluster 等。

加速 / 优化

可以采取某些优化措施来实现爬取的加速,如:

  • DNS 缓存

  • 使用更快的解析方法

  • 使用更高效的去重方法

  • 模块分离化管控

加速 / 架构

如果搭建了分布式,要实现高效的爬取和管理调度、监控等操作,我们可以使用两种架构来维护我们的爬虫项目。

  • 将 Scrapy 项目打包为 Docker 镜像,使用 K8S 控制调度过程。

  • 将 Scrapy 项目部署到 Scrapyd,使用专用的管理工具如 SpiderKeeper、Gerapy 等管理。

以上便是我分享的全部内容,所有的内容几乎都展开说了,一共讲了一个半小时。

上面的文字版的总结可能比较简略,非常建议大家如有时间的话观看原版视频分享,里面还能看到我本人的真面目哦,现在已经上传到了 Bilibili,链接为:https://www.bilibili.com/video/av34379204,大家也可以通过点击原文或扫码来查看视频。

另外对于这部分内容,其实还有我制作的更丰富的思维导图,预览图如下:

另外还有原演讲稿我也一并分享给大家,都放在公众号了。

获取方式如下:

  • 回复”爬虫讲稿“,获取本次分享的 PPT 内容。

  • 回复”思维导图“,获取爬虫思维导图。

这可能是你见过的最全的网络爬虫干货总结!相关推荐

  1. 这可能是你见过的最全的网络爬虫总结

    前段时间参加了一场 Python 网络爬虫主题的分享活动,主要以直播的形式分享了我从事网络爬虫相关研究以来的一些经验总结.整个分享分为三个阶段,第一阶段先介绍了自己从大学以来从事编程开发以来的相关历程 ...

  2. 干货下载:可能是你见过的最全的网络爬虫总结

    昨天的时候我参加了一场 Python 网络爬虫主题的分享活动,主要以直播的形式分享了我从事网络爬虫相关研究以来的一些经验总结,整个直播从昨天下午 1 点一直持续到下午 5 点,整整四个小时. 整个分享 ...

  3. 这应该是你见过的最全前端下载总结

    这应该是你见过的最全前端下载总结 frontend-download-sample 自己整理的一些项目中遇到过的关于上传和下载的一些Demo,大前端系列(也就是纯前端 + node端完成的下载,只要获 ...

  4. 这绝对是你见过的最全深度学习服务器管理配置手册,学不会你打我

    这绝对是你见过的最全深度学习服务器管理/配置手册,学不会你打我 最近在配置服务器,遇到了不少问题,在此整理记录一下.主要是以下几个方面:多用户管理.服务器环境配置.Anaconda虚拟环境安装Tens ...

  5. 曾鸣:为什么要让「听得见炮火的士兵」做决定?| 干货

    基于创造力的需求组织的架构应该怎么变化? 我的观点是基于科层制结构以管理为核心的公司架构,会演变为以赋能为关键词的创新平台,这种创新的组织架构在于提供平台,让一群创造者可以更自由的联结.更顺畅的协同. ...

  6. 华清远见星创客·大咖来探班干货风暴再次来袭!全网直播

    星创客·大咖来探班活动即将迎来第三期,在前几期强烈影响下,不少嵌入式开发者纷纷在官网留言要求:"能否在网络上直播该活动?我们不要看录播!"既然如此,华清远见决定第三期活动,将采用映 ...

  7. 「硬见小百科」全类型电阻介绍

    一 电阻的基本原理 电阻,和电感.电容一起,是电子学三大基本无源器件:从能量的角度,电阻是一个耗能元件,将电能转化为热能. 数年前,出现了第四种基本无源器件,叫忆阻器(Memristor),代表磁通量 ...

  8. 你见过的最全面的python重点

    首先和大家说个对不起,由于总结了太多的东西,所以篇幅有点长,这也是我"缝缝补补"总结了好久的东西,对于Nginx的东西我没总结在这里,大家可以Python聚焦看,点击直达专栏哦. ...

  9. 你见过的最全面的 Python 重点

    关注"小詹学Python",带你一起成长! 由于总结了太多的东西,所以篇幅有点长,这也是我"缝缝补补"总结了好久的东西. Py2 VS Py3 print成为了 ...

最新文章

  1. 青蛙跳台阶c语言递归函数,青蛙跳台阶问题的四种解法
  2. double取整数部分_剑指offer_16_数值的整数次方
  3. 我的第一个SharePoint2013 App
  4. VTK:椭圆圆柱用法实战
  5. jquery可编辑表格(版本二)
  6. 诺奖奖金为何119年还没发完?
  7. Yum安装Memcache
  8. python multiprocessing 批量下载图片+tqdm
  9. harbor1.4.0高可用部署
  10. 软考中级——数据库系统工程师
  11. Stata初步处理CFPS数据(merge)
  12. VSCode的VUE项目侧边栏打开资源管理器中的NPM脚本
  13. 用机器学习做风控的氪信,凭什么获金牌投资人章苏阳数千万融资?
  14. Unity3D-实现第一人称人物动作: 走,跑,跳,移动视角
  15. 用java写的游戏you_关于用Java写的贪吃蛇游戏的一些感想
  16. Tiny C Compiler最小的C语言编译器
  17. MOSFET 和 IGBT 栅极驱动器电路的基本原理学习笔记(六)变压器耦合栅极驱动
  18. 微信小程序:多功能起名查重工具
  19. php 上午 和下午,“上午”和“下午”的表示法
  20. Matlab figure去白边

热门文章

  1. 亚马逊、Lazada、ebay、wish、shopee、速卖通、阿里国际、沃尔玛、newegg、mercari测评自养号,卖家如何选择热门产品?来提高店铺产品的权重?
  2. MySQL零基础从入门到精通(函数篇)
  3. NS3安装步骤【MAC系统】
  4. 唯快不破的分块传输绕WAF
  5. Genio 500核心板,MT8385安卓核心板定制方案
  6. 街景字符编码识别赛事Task4
  7. 30岁以后的华丽转身
  8. 成员函数对象类的const和非const成员函数的重载
  9. 肿瘤NGS生信知识来源-博客、公众号、网站
  10. (13)打鸡儿教你Vue.js