By Chen.lin10 min read2078 words

Spider

ThoughtsSpiderScrapySelenium

何为爬虫?数据抓取

爬虫是一种自动化的程序,按照设定规则访问网页并提取数据。实际上网络上充斥爬虫的流量,搜索引擎本质上也是爬虫。曾经看到过有人统计,网络上过半的流量来自于爬虫,而非真人的操作。在我看来,爬虫就是用python写的一段简单的脚本,帮助我抓取一些数据。实际上,个人用到的情况比较少,但是也有。比如我曾经想要抓取一个壁纸网站上的美女壁纸,但是那个网站反爬做的很好,我一时没有搞定。

在实际的工作中,却经常能遇到需要使用爬虫的情形。抓取一些数据。在工作中,有时可以大大提升效率。

写爬虫的基本思路

首先,明确需要抓取的内容,例如:Amazon的库存,某内容分享网站上某个博主一段时间内创作的内容,或者是某个网站的一些图片。

其次,明确了内容后,开始第二步,找到拿到数据的方式。对于针对网页的爬虫,一般有两种方式:

1.来自接口

2.来自网页html

众所周知,网页渲染的数据最后都是以html的形式,我不管你是怎样渲染,客户端渲染还是SSR,最终都是以HTML的形式。也就是说,我们在网页上看见的每一个数据,字符,图片都在html中。写爬虫的有句话叫:“万物皆可爬”,或者“可见即可爬”。就是这个原因。因为即使接口复杂,难以分析,或者有什么反爬措施,但你永远可以选择方式2。

虽然方式2是万能的,但是,需要去提取出有用数据,而且速度相对较慢(如果使用selenium会更慢)。使用网页的接口,在找到数据接口的前提下,也许接口有加密的参数,又需要去“破解”加密,,,。现在先不提,后面再举例子说明。但是一旦有接口可用,那整个数据抓取的过程就简单了。直接“不断请求”接口就可以了。

总之,使用哪种方式要视情况而定。

这里,我的思路是,先简单的找接口,大多数应该都能很容易找到接口。然后看看接口有没有什么看不懂的参数输入(也需是加密的字段)。就是凭经验判断这个接口是否好搞定,如果没有什么反爬,比如只有一个cookies,传一下就好了,就使用接口来获取数据。如果接口反爬做的很强,就使用解析网页的方式。

用到的技术框架

主要使用 python 的两个工具包:

一些简单的直接用request请求网页就可以了。

很多网站需要登录,你可以登陆后记录cookies, 也可以使用Selenium模拟登录。

如果要进行App端的逆向工程,需要使用抓包工具。

1. Selenium:模拟浏览器操作

Selenium 是一个自动化测试工具,常用于模拟真实用户的浏览器操作。对于需要执行 JavaScript 动态加载的网页(如 AJAX 请求、滚动加载的页面),Selenium 是最好的选择。

核心特点

  • 可以像用户一样操作网页(点击、输入、滚动等)。
  • 适用于JS 渲染的页面(如 React、Vue、Angular)。
  • 可配合无头浏览器(如 Chrome Headless)提高效率。
  • 支持多种浏览器(Chrome、Firefox、Edge)。

适用场景

  • 需要模拟登录,提交表单。
  • 需要执行 JS 渲染后的数据抓取。
  • 需要动态加载(如无限滚动)。

劣势

  • 速度较慢(因为要加载整个网页)。
  • 资源占用高(相比 Scrapy)。
  • 容易被反爬(需要配合代理、随机 UA 伪装)。

2. Scrapy:高效爬取结构化数据

Scrapy 是一个专门用于爬虫的 Python 框架,适用于静态网页或 API 数据抓取,具有高效、可扩展的特点。

核心特点

  • 异步爬取,速度快(基于 Twisted)。
  • 内置解析(支持 XPath、CSS 选择器)。
  • 自动去重,防止重复抓取。
  • 强大的中间件(代理池、Cookies 管理)。

适用场景

  • 批量抓取(如电商网站的商品列表)。
  • API 抓取(只需解析 JSON)。
  • 静态网页(页面加载后数据已存在 HTML 里)。

劣势

  • 不能直接执行 JavaScript(适用于静态页面)。
  • 对复杂交互支持较弱(需要和 Selenium 结合)。

例子1. 某内容分享网站

image.png

类似这种网页渲染出的列表,F12可以很容易找到一个接口以 topics结尾的api,中间还嵌入了 一个路径参数 48885445811428 这显然是这个页面展示的组的id, 还有两个参数用于获取每页的数量和范围。

image.png

从这个调用上可以看到多了一个 begin_time 的参数,显然这是用于获取一下页的参数,这个时间应该是上一页的最后一条数据的时间。接口是按照时间顺序展示的。实际上知识星球就是类似与朋友圈一样按照时间线展示的。所以这个参数传递的是一个时间,这里时间字符串经过了URL 编码。

2025-03-08T16%3A54%3A12.393%2B0800

2025-03-08T16:54:12.393+0800

接口的常见参数

  • Base64 编码

    例如:ZGF0YQ==("data" 的 Base64)

    用途:部分接口使用 Base64 处理参数(如授权令牌、加密数据)。

  • Hex 编码(十六进制)

    例如:48656c6c6f("Hello" 的 Hex 编码)

    用途:某些参数可能是 Hex 编码的字符串或二进制数据。

  • Unix 时间戳(秒)

    例如:1709887200(2025-03-08 16:00:00 UTC)

    用途:常用于查询范围、缓存校验。

  • Unix 时间戳(毫秒)

    例如:1709887200123(比秒级多三位)

    用途:用于更精确的时间记录。

  • ISO 8601 格式

    例如:2025-03-08T16:00:00Z / 2025-03-08T16:00:00.123+08:00

    用途:通常用于 API 传递时间参数。

  • Token / AccessKey

    例如:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...(JWT)

    用途:用户认证、API 访问权限控制。

  • MD5/SHA 哈希

    例如:e99a18c428cb38d5f260853678922e03abc123 的 MD5)

    用途:数据完整性校验、身份验证。

  • 分页参数

    • page=2&size=10(常见分页方式)
    • offset=20&limit=10(偏移量方式)
    • cursor=MTcwOTg4NzIwMA==(Base64 编码的游标)
  • 数据排序

    • sort=desc / sort=asc
    • orderby=created_at
    • order=price_desc
  • 请求 ID

    • request_id=123e4567-e89b-12d3-a456-426614174000 (UUID)

    用途:某些 API 可能要求携带请求唯一标识。

例子2.Amazon库存

这个例子尝试进入Amazon网页的购物车中,通过不断点击加购的方式测试库存。

点击加购,发现出现了两个接口调用:

看到第一个接口出现了 update, 几乎可以确定这个接口就是调整库存的关键接口。

image.png

查看返回的数据,似乎的确是返回了调整到的目标库存数 3 .

image.png

但是接口中的参数也是让人头皮发麻,接口不是我们写的。我们当然不可能知道每个参数具体是做什么的。

但是其中一些还是可以看出来的,例如

quantity.902d14a1-12c2-47e6-b8aa-d895eaa7e2bd:3

3 是我们要购买的数量,quantity 也说明这一点。 但是 902d14a1-12c2-47e6-b8aa-d895eaa7e2bd 我们不知道是什么意思。而且这个字符串在后面反复出现,如果要调用这个接口,显然需要知道这个字符的生成的方式或者想办法拿到它。

asin: B0CQVWT2NH 这个网上一查就能查出来 类似于amazon的 SKU, 代表了这个产品的唯一字符串。

encodedOffering 一时看不出来

activeItems 一个数组,内部有一个元素,可以从两个关键点(quantity和price)上看出来这是当前购物车的状态. 包含了当前购物车内的全部数据。

timeStamp: 1742011911 显然是秒级的时间戳

requestID token 似乎都是用于接口的加密

以上是我们可以得到的基本信息。

image.png

我们不断的点击,当添加到 10 的时候,加号消失了,改为使用输入。

image.png

这个时候尝试 500 999 2000

发现当输入2000 的时候接口却将数据返回为 1000. 那是不是说目前商家的库存就是 1000呢?

image.png

我们换一个产品尝试:

发现当超过其库存的时候会弹出提示。 91 就是其实际的库存数。刚才的1000显然是某种上限,而不是真正的库存。

image.png

image.png

在接口的response中搜索 “only” 找到刚才的上图的弹窗其实来自这里。

image.png

image.png

到这里其实可以看到一条似乎可能实现自动化的抓取库存数据的方式。不过要使用这个接口仍然需要解决requestID token等参数 的问题。 没有这些参数是不可能调用接口的。

下面就是如何得到这些参数的输入。有人可能会想直接找到他们生成的方式,确实,一些字段就是在前端根据一些规则生成的,而且代码 js 就在你的浏览器上运行,我们当然能看到。甚至我们可以拿到这些js代码我们自己去执行它,或者将它的逻辑原封不动转成python代码去执行生成这些加密的参数。但是有些也可能是服务端生成。那我们就不可能得知其生成的方式了。

但是,实际上没有那么麻烦,我们可以直接拿到这些字符在网页源码中搜索。

image.png

可以看到,直接就知道了一些字段。

image.png

image.png

这些字段就保存在html中的某个位置,这可能是某段js执行后的结果。也可以选择慢慢去打断点,找到这些字段的生成的方式。但是应该很费劲。直接用xpath 拿到这些字段就可以调用接口了。 //form[@id='activeCartViewForm']/input[@name='token']/@value

简单解释:// 表示相对路径,开头的//form[@id='activeCartViewForm']表示找到网页中一个form元素且他的id是activeCartViewForm。 后续的/input[@name='token'] 表示找到刚才的form的子元素中的 input 元素且name 是token. 最后获取他的value

例如:XPath 是爬虫的基础,必须掌握

image.png

以下是总结后的可行思路:

Amazon 库存抓取流程优化:

  1. 数据库中存储所有将要抓取的asin 。即url
  2. selenium 访问每个商品详情页,通过模拟点击将产品加入到购物车。 获取完整的 cookies 保存下来.
  3. 对于没有保存cookies的产品,视为初次抓取数据,进行第二步。
  4. 已经保存cookies的产品,直接使用cookies登录到购物车页面
  5. 分析 购物车页面的组合参数, 开始测试 库存量。【通过加购的接口不断添加购买量直到接口返回库存不足】

可以看出,这个流程是结合了方式1 和2 . 进入购物车我们使用的是selenium去请求网页,执行动态的网页加载。这是为了拿到最后的调整库存接口的参数。

灰色

1. 法律层面:数据访问权限与法律冲突

(1) 违反网站的服务条款(ToS)

  • 许多网站的 Terms of Service(服务条款) 明确禁止爬取其数据。例如:
    • Twitter/XFacebook 明确禁止自动化抓取用户数据。
    • 淘宝、京东 明确规定爬虫属于“恶意爬取”行为。
  • 灰色点:ToS 不是法律,违反 ToS 不一定违法,但可能导致 封号、IP 封禁,甚至 法律起诉

(2) 侵犯版权或数据所有权

  • 许多数据受 著作权保护(如新闻、文章)。
  • 你爬取的数据如果被二次加工、商业化,可能涉及 知识产权侵权
  • 灰色点:如果只是个人研究非盈利用途,风险较低;如果用于竞争性商业用途(如搬运、倒卖),风险较高。

(3) 违反数据隐私法

  • 欧洲 GDPR(通用数据保护条例) 明确规定:
    • 任何公司/个人 未经用户同意 不能收集或存储 个人数据(如姓名、邮箱、IP)。
  • 美国 CCPA(加州消费者隐私法) 也规定:
    • 用户有权要求删除或拒绝第三方爬取数据。
  • 中国《网络安全法》《数据安全法》 规定:
    • 未经授权爬取用户数据,可能涉及 非法获取计算机数据 的违法行为。
  • 灰色点:如果抓取的数据是公开可见的,通常风险较小;但如果抓取用户隐私信息(如手机号、聊天记录),可能涉及违法

2. 道德层面:爬虫对网站及用户的影响

(1) 影响网站正常运行

  • 频繁请求服务器,可能导致:
    • 消耗带宽、占用资源,影响正常用户访问。
    • 被网站识别为 DDoS 攻击,甚至导致服务器崩溃。
  • 灰色点:合理控制爬取频率(如 time.sleep()、使用 robots.txt 规则)可以降低风险。

(2) 破坏网站的商业利益

  • 许多平台靠数据变现(如付费 API、会员制),爬虫绕过这些限制,相当于绕过付费墙
  • 灰色点:如果是学术研究个人兴趣,通常问题不大,但如果爬取数据用于竞争对手业务,可能会被起诉。

(3) 滥用数据

  • 抓取后的数据可能被用于欺诈、垃圾营销,如:
    • 爬取邮箱手机号发送垃圾邮件、诈骗信息
    • 爬取电商数据恶意竞争、价格战
  • 灰色点:如果只是自己使用,不泄露数据,风险较低;但如果对外提供爬取的数据(如卖数据),则风险极高。

3. 技术层面:如何减少法律与道德风险

(1) 遵守 robots.txt 规则

  • robots.txt 是网站提供的爬取规则,规定哪些页面可以或不可以被爬取。例如:

    User-agent: * Disallow: /private/
  • 灰色点robots.txt 不是法律,但大部分正规爬虫会遵守。

(2) 控制爬取频率,避免影响服务器

  • 避免高频率请求:time.sleep
  • 灰色点:爬得太快,可能触发反爬机制,甚至导致服务器宕机。

(3) 避免绕过登录、验证码

  • 绕过验证码(如滑块验证码、短信验证)可能会被网站认定为“攻击”行为。
  • 使用他人账户爬取(如爬取别人的私人聊天记录)可能涉及违法。

(4) 不要爬取用户隐私数据

  • 公开数据(如新闻、商品信息)风险较低,但用户数据(如手机号、地址)风险极高
  • 如果必须爬取带隐私的数据,建议进行匿名化处理

法律风险

可以做的(低风险)

  • 爬取 公开网页(如新闻、商品信息)。
  • 遵守 robots.txt 规则,避免过度抓取。
  • 限制请求频率,减少服务器压力。
  • 学术研究、个人学习(非商业用途)。

慎重考虑的(灰色)

  • 爬取需要登录的数据(如会员内容)。
  • 爬取竞争对手数据(可能涉及商业纠纷)。
  • 爬取版权内容(如付费文章、电影资源)。

🚫 坚决不要做的(违法)

  • 爬取 用户隐私信息(如手机号、聊天记录)。
  • 绕过验证码、登录保护(可能构成黑客攻击)。
  • 爬取数据后 对外出售、用于诈骗

https://kingname.info/2022/04/13/global-crawler-1/#google_vignette