前言

我搞爬虫断断续续也两三年了,不专职做,但经常遇到一些数据的需求,所以绕不开它。
看了目前出版的书籍,以及CSDN和知乎上一些讨论。简单总结一下个人体会。

互联网上60%的数据是无需登录就能获取的,这些用bs4+requests就能解;还有30%的数据是需要登录的,用selenium解;剩下10%的数据需要逆向破解才能获取。

对于需要登录才能访问的HTTP请求,有两类数据需要逆向破解:

  • cookie: 通过浏览器插件或Mitmproxy能拿到
  • 动态参数:通过逆向JS、模拟浏览器运行(补环境)就能破解其加密方式

逆向JS常用手段就是在浏览器中调试js,追踪某些参数的来龙去脉,然后将其逻辑提取出来。

先看看市场上对爬虫工程师的要求:
在这里插入图片描述

三种境界

或者是三个阶段。

第一个阶段: 爬取无需登录的裸数据

或者叫静态数据。这个阶段就是会利用bs4加requests这对黄金搭档,能搞掂无需登录的页面数据。能根据浏览器devtool分析一些ajax请求的URL,然后采用三套件爬取。例如一些无限下拉请求,分页请求的数据。
例如,我们要爬取CSDN上某个博主的文章,就可以先分析出博客列表的获取URL,然后根据每个文章的URL就能获得内容。这种方式简单经济,为我们爬取数据的首选方式。
完成这个阶段,基本能搞掂60~70%数据的获取了。也算是初级爬虫工程师了。

在这个阶段,还要学会一些爬虫框架的使用,如Scrapy、WebMagic。爬虫框架大同小异。爬虫框架解决递归搜索+去重两大核心问题。网页中有两类数据:html和json,如果不需要递归搜索,只是针对特定的URL进行爬取,就无需用爬虫框架。

这个阶段需要掌握的核心技能:HTML/HTTP,cookie处理,分析ajax请求并学会构造各种ajax请求,以及HTML中数据的提取,最基本的CSS和XPath选择器的使用。

第二个阶段: 爬取动态数据

特点:需要登录或一定的页面交互才能渲染出来的数据。
这个阶段能利用selenium,或puppeteer或Playwright搞掂一些动态数据。所谓动态,就是页面第一次渲染不会出来的数据,也就是你直接用request.get()拿不到,需要手工点击,下拉或延迟才能加载出来的数据。

采用selenium/puppeteer/Playwright拉起chrome,debug模式,手工登录一次,然后selenium模拟人工随机点击,保持会话,然后即可做其它数据抓取。笔者采用此法屡试不爽。避开了要破解登录的难题

这个阶段,能模拟一些简单的登录,分析页面的请求流程,然后组装自己的爬取逻辑。

第三个阶段: 爬取加密数据

场景:数据被做过加密处理,需要逆向与破解。

此阶段的技能要求:

  • 通过抓包工具(Charles, mitmproxy等)分析请求过程和数据
  • 通过机器学习工具、OCR 技术破解验证码。能使用Tesseract,百度AI, HOG+SVM,CNN等库进行验证码识别
  • 通过静态逆向分析加密和混淆过的JS代码,获取cookie,token数据,破解登录过程。例如在自己的环境里执行js代码,获得其中变量值,典型案例为execjs库破解521返回码问题。
  • 通过动态调试、Hook手段破解可执行文件和动态库,工具有IDA Pro,Frida,Frida-RPC,AndServer-RPC,unidbg,Xposed框架等
  • 借助AI算法,动态调整爬虫的爬取策略,从而避免被禁IP封号
  • 掌握分布式爬虫进行大规模的数据抓取
  • 熟悉各种反爬技术,包括常见的特征指纹反爬,内嵌网页反爬,CSS偏移反爬,无限Debugger,JS Hook逆向,内存爆破,AST混淆,各类验证码反爬。

此阶段包括网站和app数据的抓取。
了解常用的反爬技术:特征指纹反爬,内嵌网页反爬,CSS偏移反爬,无限Debugger,JS Hook逆向,内存爆破,AST混淆,各类验证码反爬。

几点体会

  • 不要想着把所有操作都自动化,这样成本会比较高。自动化要一步步来,先比全手工提高半步就行。例如抓取csdn的所有社区,直接从devtool里拿就是,何须要自动化呢?
  • 工具都有局限性,要结合多个工具
  • 优先使用bs4, requests搞掂,下下策再去考虑逆向

几个工具

Frida

一个类似 Xposed/Substrate 的跨平台、动态、插装工具,借助 python 和 javascript,可以非常快速便捷地操作目标进程、修改函数参数返回值等,支持 Android/iOS/Macos/Linux/Windows。

JEB

一款全面的Dalvik反编译器。将Dalvik字节码反编译为Java源代码,无需DEX-JAR转换工具。

附录:《Python3网络爬虫开发实战 第2版 2021 崔庆才》

第1章 爬虫基础 1
1.1 HTTP基本原理 1
1.2 Web 网页基础 12
1.3 爬虫的基本原理 19
1.4 Session和Cookie 21
1.5 代理的基本原理 24
1.6 多线程和多进程的基本原理 26
第2章 基本库的使用 29
2.1 urllib的使用 29
2.2 requests的使用 47
2.3 正则表达式 63
2.4 httpx的使用 73
2.5 基础爬虫案例实战 78
第3章 网页数据的解析提取 90
3.1 XPath的使用 90
3.2 Beautiful Soup的使用 99
3.3 pyquery的使用 113
3.4 parsel 的使用 124
第4章 数据的存储 128
4.1 TXT 文本文件存储 128
4.2 JSON 文件存储 130
4.3 CSV 文件存储 134
4.4 MySQL 存储 138
4.5 MongoDB 文档存储 144
4.6 Redis缓存存储 151
4.7 Elasticsearch 搜索引擎存储 159
4.8 RabbitMQ 的使用 166
第5章 Ajax 数据爬取 174
5.1 什么是 Ajax 174
5.2 Ajax分析方法 176
5.3 Ajax 分析与爬取实战 179
第6章 异步爬虫 191
6.1 协程的基本原理 191
6.2 aiohttp的使用 201
6.3 aiohttp 异步爬取实战 207
第7章 JavaScript 动态渲染页面爬取 212
7.1 Selenium 的使用 212
7.2 Splash 的使用 226
7.3 Pyppeteer 的使用 242
7.4 Playwright 的使用 257
7.5 Selenium 爬取实战 269
7.6 Pyppeteer 爬取实战 276
7.7 CSS 位置偏移反爬案例分析与爬取实战 282
7.8 字体反爬案例分析与爬取实战 287
第8章 验证码的识别 293
8.1 使用 OCR 技术识别图形验证码 293
8.2 使用 OpenCV 识别滑动验证码的缺口 298
8.3 使用深度学习识别图形验证码 304
8.4 使用深度学习识别滑动验证码的缺口 309
8.5 使用打码平台识别验证码 316
8.6 手机验证码的自动化处理 324
第9章 代理的使用 331
9.1 代理的设置 331
9.2 代理池的维护 340
9.3 付费代理的使用 351
9.4 ADSL 拨号代理的搭建方法 357
9.5 代理反爬案例爬取实战 365
第 10章 模拟登录 373
10.1 模拟登录的基本原理 373
10.2 基于Session和Cookie的模拟登录爬取实战 376
10.3 基于JWT的模拟登录爬取实战 381
10.4 大规模账号池的搭建 385
第 11章 JavaScript 逆向爬虫 397
11.1 网站加密和混淆技术简介 397
11.2 浏览器调试常用技巧 413
11.3 JavaScript Hook 的使用 430
11.4 无限 debugger 的原理与绕过 440
11.5 使用 Python 模拟执行 JavaScript 445
11.6 使用 Node.js 模拟执行 JavaScript 451
11.7 浏览器环境下 JavaScript 的模拟执行 454
11.8 AST 技术简介 460
11.9 使用 AST 技术还原混淆代码 472
11.10 特殊混淆案例的还原 480
11.11 WebAssembly 案例分析和爬取实战 490
11.12 JavaScript 逆向技巧总结 498
11.13 JavaScript 逆向爬取实战 505
第 12章 App 数据的爬取 530
12.1 Charles 抓包工具的使用 530
12.2 mitmproxy 抓包工具的使用 538
12.3 mitmdump 实时抓包处理 544
12.4 Appium 的使用 551
12.5 基于 Appium 的 App 爬取实战 562
12.6 Airtest 的使用 568
12.7 基于 Airtest 的 App 爬取实战 585
12.8 手机群控爬取实战 591
12.9 云手机的使用 594
第 13章 Android 逆向 603
13.1 jadx 的使用 603
13.2 JEB 的使用 615
13.3 Xposed 框架的使用 624
13.4 基于 Xposed 的爬取实战案例 635
13.5 Frida 的使用 643
13.6 SSL Pining 问题的解决方案 650
13.7 Android 脱壳技术简介与实战 657
13.8 利用 IDA Pro 静态分析和动态调试 so 文件 664
13.9 基于 Frida-RPC 模拟执行 so 文件 680
13.10 基于 AndServer-RPC 模拟执行 so 文件 685
13.11 基于 unidbg 模拟执行 so 文件 692
第 14章 页面智能解析 700
14.1 页面智能解析简介 700
14.2 详情页智能解析算法简介 707
14.3 详情页智能解析算法的实现 714
14.4 列表页智能解析算法简介 722
14.5 列表页智能解析算法的实现 727
14.6 如何智能分辨列表页和详情页 735
第 15章 Scrapy框架的使用 739
15.1 Scrapy框架介绍 739
15.2 Scrapy入门 743
15.3 Selector 的使用 754
15.4 Spider 的使用 759
15.5 Downloader Middleware的使用 766
15.6 Spider Middleware的使用 775
15.7 Item Pipeline的使用 781
15.8 Extension的使用 792
15.9 Scrapy 对接 Selenium 795
15.10 Scrapy 对接 Splash 801
15.11 Scrapy 对接 Pyppeteer 806
15.12 Scrapy 规则化爬虫 813
15.13 Scrapy 实战 827
第 16章 分布式爬虫 840
16.1 分布式爬虫理念 840
16.2 Scrapy-Redis原理和源码解析 842
16.3 基于Scrapy-Redis的分布式爬虫实现 847
16.4 基于Bloom Filter进行大规模去重 851
16.5 基于RabbitMQ的分布式爬虫 859
第 17章 爬虫的管理和部署 862
17.1 Scrapyd和ScrapydAPI的使用 862
17.2 Scrapyd-Client 的使用 867
17.3 Gerapy 爬虫管理框架的使用 869
17.4 将Scrapy 项目打包成 Docker 镜像 873
17.5 Docker Compose 的使用 878
17.6 Kubernetes的使用 880
17.7 用 Kubernetes 部署和管理 Scrapy 爬虫 888
17.8 Scrapy 分布式爬虫的数据统计方案 899
17.9 基于Prometheus和Grafana的分布式爬虫监控方案 904
附录 爬虫与法律 917

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐