iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >打造一个健壮高效的网络爬虫
  • 808
分享到

打造一个健壮高效的网络爬虫

爬虫高效健壮 2023-01-30 23:01:05 808人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

以下内容转自爬虫界大佬崔庆才的文章,传送门   整个分享的主题叫做《健壮高效的网络爬虫》,本次分享从抓取、解析、存储、反爬、加速五个方面介绍了利用 python 进行网络爬虫开发的相关知识点和技巧,介绍了不同场景下如何采取不同措施高效地进

以下内容转自爬虫界大佬崔庆才的文章,传送门

 

整个分享的主题叫做《健壮高效的网络爬虫》,本次分享从抓取、解析、存储、反爬、加速五个方面介绍了利用 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 等。
  • 数据库,分为关系型数据库、非关系型数据库,如 MysqlmongoDBHBase 等,常用的库有 pymysql、pymssqlRedis-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 等。

加速 / 异步

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

加速 / 分布式

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

加速 / 优化

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

  • DNS 缓存
  • 使用更快的解析方法
  • 使用更高效的去重方法
  • 模块分离化管控

加速 / 架构

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

  • 将 Scrapy 项目打包为 Docker 镜像,使用 k8s 控制调度过程。
  • 将 Scrapy 项目部署到 Scrapyd,使用专用的管理工具如 SpiderKeeper、Gerapy 等管理。

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

 

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

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

 

 

 

--结束END--

本文标题: 打造一个健壮高效的网络爬虫

本文链接: https://www.lsjlt.com/news/180784.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 打造一个健壮高效的网络爬虫
    以下内容转自爬虫界大佬崔庆才的文章,传送门   整个分享的主题叫做《健壮高效的网络爬虫》,本次分享从抓取、解析、存储、反爬、加速五个方面介绍了利用 Python 进行网络爬虫开发的相关知识点和技巧,介绍了不同场景下如何采取不同措施高效地进...
    99+
    2023-01-30
    爬虫 高效 健壮
  • Vue 组件与 TypeScript:打造健壮高效的前端应用
    优点 类型检查: TypeScript 提供类型检查,确保数据类型正确,从而发现编码失误,提高代码质量。 更好的可读性: TypeScript 的类型提示使代码更易于理解,即使对于不熟悉代码库的人也是如此。 可重用性: TypeScri...
    99+
    2024-03-14
    TypeScript与Vue组件
  • ASP 变量与数据类型:打造健壮而高效的代码
    声明变量:使用 Dim 关键字声明变量,例如:Dim myVariable 赋值:使用等号 (=) 运算符将值分配给变量,例如:myVariable = "值" 数据类型 数据类型指定变量可以存储的数据类型。不同的数据类型具有不同的属...
    99+
    2024-03-11
    变量 变量用于存储信息 并在脚本或应用程序中进行处理。它们通过名称引用 并且可以保存不同类型的数据。
  • 怎么用Scrapy构建一个网络爬虫
    这篇文章主要讲解了“怎么用Scrapy构建一个网络爬虫”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Scrapy构建一个网络爬虫”吧!我们来看下Scrapy怎么做到这些功能的。首先准备...
    99+
    2023-06-03
  • Java中怎么实现一个网络爬虫
    Java中怎么实现一个网络爬虫,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。首先介绍每个类的功能:DownloadPage.java的功能是下载此超链接的页面源代码.Fun...
    99+
    2023-06-17
  • Java网络编程的制胜之道:打造高效网络应用
    根据应用程序需求选择合适的网络协议和通信模式。 考虑负载均衡、缓存和分布式架构来提高可扩展性和性能。 优化通信流以最小化延迟和带宽消耗。 3. 采用异步 non-blocking I/O 使用非阻塞 I/O 避免传统阻塞 I/O 的...
    99+
    2024-03-15
    网络编程
  • java实现一个简单的网络爬虫代码示例
    目前市面上流行的爬虫以python居多,简单了解之后,觉得简单的一些页面的爬虫,主要就是去解析目标页面(html)。那么就在想,java有没有用户方便解析html页面呢?找到了一个jsoup包,一个非常方便解析html的工具呢。使用方式也非...
    99+
    2023-05-30
    网络爬虫 java jsoup
  • 如何构造一个C#语言的爬虫程序
    本篇内容介绍了“如何构造一个C#语言的爬虫程序”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!   转CS...
    99+
    2024-04-02
  • 怎么在python中使用selenium实现一个网络爬虫
    本篇文章为大家展示了怎么在python中使用selenium实现一个网络爬虫,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科...
    99+
    2023-06-08
  • 使用JavaIO流和网络制作一个简单的图片爬虫
    目录Java IO流和网络的简单应用Java IO 流和 URL 类Java IO流URL 类Java 爬虫ClientDataProcessUtilDownLoadUtilWind...
    99+
    2023-05-14
    JavaIO流 网络 JavaIO流爬虫 图片爬虫
  • 结合Python网络爬虫做一个今日新闻小程序
    核心代码 requests.get 下载html网页 bs4.BeautifulSoup 分析html内容 from requests import get from bs4 i...
    99+
    2024-04-02
  • 使用C++编写一个DHT爬虫,实现从DHT网络爬取BT种子
    以下是一个简单的使用C++编写的DHT爬虫,以从DHT网络中爬取BT种子:```cpp#include #include #incl...
    99+
    2023-10-12
    C++
  • 使用Go语言开发高并发的网络爬虫
    使用Go语言开发高并发的网络爬虫随着互联网的迅速发展,信息量呈爆炸式增长。为了获取海量的数据,网络爬虫成为了一种重要的工具。而在开发网络爬虫时,高并发的处理能力往往是一个关键的需求。本文将介绍如何使用Go语言开发一款高并发的网络爬虫。Go语...
    99+
    2023-11-20
    Go语言 网络爬虫 高并发
  • 阿里云代理:打造高效稳定的网络代理服务
    1. 什么是阿里云代理? 阿里云代理是阿里云提供的一种网络代理服务,它可以帮助用户在云上构建高效稳定的网络连接。通过阿里云代理,用户可以实现跨地域、跨网络的互联互通,提高网络传输效率和稳定性。 2. 阿里云代理的特点和优势 2.1 高可用...
    99+
    2023-10-27
    高效 阿里 代理服务
  • PHP开发技术:打造一个网络游戏社区
    PHP开发技术:打造一个网络游戏社区随着网络的普及和发展,网络游戏已经成为一种受欢迎的娱乐方式。越来越多的人加入网络游戏的行列,享受着虚拟世界的刺激和乐趣。然而,随之而来的问题是如何打造一个优质的网络游戏社区,为玩家们提供交流、互动和共享游...
    99+
    2023-10-27
    PHP开发 社区 网络游戏
  • PHP开发技术:打造一个网络问答平台
    随着互联网的迅速发展,越来越多的人开始逐渐依赖网络获取信息。在这个信息爆炸的时代,网络问答平台成为了人们获取知识、解决问题的重要途径。为了满足人们对于高质量问答的需求,基于PHP开发的网络问答平台应运而生。本文将介绍如何利用PHP开发技术打...
    99+
    2023-10-27
    PHP开发 网络问答 平台打造
  • PHP开发技术:打造一个网络问答社区
    PHP开发技术:打造一个网络问答社区随着互联网的快速发展和信息的爆炸式增长,网络问答社区逐渐成为人们获取知识和解决问题的主要方式。在这样的背景下,利用PHP开发技术来打造一个高效、稳定的网络问答社区成为了一个具有吸引力的项目。一.社区特点及...
    99+
    2023-10-27
    PHP开发 社区 网络问答
  • PHP开发技术:打造一个网络购物社区
    随着互联网的快速发展和智能手机的普及,网络购物成为人们日常生活中的重要组成部分。作为一种便捷、快速、多元化的购物方式,网络购物逐渐取代传统零售业,成为消费者的首选。那么,如何打造一个成功的网络购物社区呢?在本文中,将介绍PHP开发技术,以及...
    99+
    2023-10-27
    PHP开发 网络购物 社区打造
  • 阿里云大宽带服务器打造高效网络体验
    # 在数字化时代,网络连接已经成为企业和个人日常生活的基石。随着互联网应用和数据量的快速增长,传统的宽带网络已经无法满足日益增长的需求。阿里云作为全球领先的云计算服务提供商,推出了阿里云大宽带服务器,旨在为用户提供更快、更稳定的网络连接,提...
    99+
    2024-01-19
    高效 阿里 服务器
  • discuz:打造个性化网络空间的利器
    在当今社交化的互联网时代,个性化定制已经成为各种网络平台的必备功能,从社交网站到电商平台,个性化推荐无处不在。在建设社区论坛时,为了提升用户黏性和体验,也需要考虑如何为用户打造个性化的...
    99+
    2024-03-02
    discuz 个性化网络空间 编程利器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作