转载:https://cloud.tencent.com/developer/article/1366434
bilibili 视频 - 聊聊 Python 的应用 - 健壮高效的网络爬虫:https://www.bilibili.com/video/av34379204/
昨天的时候我参加了掘金组织的一场 Python 网络爬虫主题的分享活动,主要以直播的形式分享了我从事网络爬虫相关研究以来的一些经验总结,整个直播从昨天下午 1 点一直持续到下午 5 点,整整四个小时。
整个分享分为三个阶段,第一阶段先介绍了自己从大学以来从事编程开发以来的相关历程,第二阶段是正式的网络爬虫分享流程,详细总结了网络爬虫开发的一些要点,第三阶段是解答一些提问,并抽奖送出一些礼品。所以在这里我会对我昨天分享的主要内容做下总结,另外还会附上视频回放、PPT,另外还会为大家送上一些福利,希望大家可以支持!
整个分享的主题叫做《健壮高效的网络爬虫》,本次分享从 抓取、解析、存储、反爬、加速 五个方面介绍了利用 Python 进行网络爬虫开发的相关知识点和技巧,介绍了不同场景下如何采取不同措施高效地进行数据抓取的方法,包括 Web 抓取、App抓取、数据存储、代理选购、验证码破解、分布式抓取及管理、智能解析 等多方面的内容,另外还结合了不同场景介绍了常用的一些工具包,全部内容是我在从事网络爬虫研究过程以来的经验精华总结。
对于爬取来说,我们需要学会使用不同的方法来应对不同情景下的数据抓取任务。
爬取的目标绝大多数情况下 要么是 网页,要么是 App,所以这里就分为这两个大类别来进行了介绍。
所以整个大纲是这样子的:
网页爬取
App 爬取
服务端渲染:意思就是页面的结果是由服务器渲染后返回的,有效信息包含在请求的 HTML 页面里面,比如猫眼电影这个站点。
客户端渲染:意思就是页面的主要内容由 JavaScript 渲染而成,真实的数据是通过 Ajax 接口等形式获取的,比如淘宝、微博手机版等等站点。
服务端渲染的情况就比较简单了,用一些基本的 HTTP 请求库就可以实现爬取,如 urllib、urllib3、pycurl、hyper、requests、grab 等框架,其中应用最多的可能就是 requests 了。
对于客户端渲染,这里我又划分了四个处理方法:
对于 App 的爬取,这里分了四个处理情况:
以上便是爬取流程的相关分类和对应的处理方法。
对于解析来说,对于 HTML 类型的页面来说,常用的解析方法其实无非那么几种,正则、XPath、CSS Selector,另外对于某些接口,常见的可能就是 JSON、XML 类型,使用对应的库进行处理即可。
这些规则和解析方法其实写起来是很繁琐的,如果我们要爬上万个网站,如果每个网站都去写对应的规则,那么不就太累了吗?所以智能解析便是一个需求。
智能解析意思就是说,如果能提供一个页面,算法可以自动来提取页面的标题、正文、日期等内容,同时把无用的信息给刨除,例如上图,这是 Safari 中自带的阅读模式自动解析的结果。
对于智能解析,下面分为四个方法进行了划分:
如果能够容忍一定的错误率,可以使用智能解析来大大节省时间。目前这部分内容我也还在探索中,准确率有待继续提高。
存储,即选用合适的存储媒介来存储爬取到的结果,这里还是分为四种存储方式来进行介绍。
这部分的关键在于和实际业务相结合,看看选用哪种方式更可以应对业务需求。
反爬这部分是个重点,爬虫现在已经越来越难了,非常多的网站已经添加了各种反爬措施,在这里可以分为非浏览器检测、封 IP、验证码、封账号、字体反爬等。
下面主要从封 IP、验证码、封账号三个方面来阐述反爬的处理手段。
对于封 IP 的情况,可以分为几种情况来处理:
验证码分为非常多种,如 普通图形验证码、算术题验证码、滑动验证码、点触验证码、手机验证码、扫二维码 等。
某些网站需要登录才能爬取,但是一个账号登录之后请求过于频繁会被封号,为了避免封号,可以采取如下措施:
进群:548377875 即可获取大量的PDF!希望大家早日入门!
当爬取的数据量非常大时,如何高效快速地进行数据抓取是关键。
常见的措施有 多线程、多进程、异步(协程)、分布式、细节优化等。
爬虫是网络请求密集型任务,所以使用多进程和多线程可以大大提高抓取效率,如使用 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 等管理。