一次性数据抓取的万能方法,半自动抓取任意异步加载网站

这是「进击的Coder」的第 942 篇技术分享

作者:kingname

来源:未闻 Code

阅读本文大概需要 3 分钟。

我们有时候临时需要抓取一批数据,数据不多,可能就几页,几百条数据。手动复制粘贴太麻烦,但目标网站又有比较强的反爬虫,请求有防重放的验证,写代码抓取也不方便。用模拟浏览器又觉得没必要,只用一次的爬虫,写起来很麻烦。

例如,我经常逛色魔张大妈的精选好价页面。这个页面会列出各种折扣的信息。但它只能按大类筛选,无法用关键词搜索。如下图所示:

017e04e1d391b394e056246696f09d4f.png

我打算只看前 10 页内容就好了。但一页一页看太麻烦了。有没有什么快速爬虫,把这个列表页的内容抓取下来呢?

其实这种需求,使用半自动爬虫是最简单的。不需要考虑网站反爬虫的问题,因为你使用的就是真实的浏览器,不会通过代码来发起请求。而且这个列表页的内容都是异步加载的,直接在开发者工具可以看到数据包,数据包里面就有当前页面的全部内容。如下图所示:

6438a69d953a7f2ed4f19c712fda3629.png

有没有什么办法,快速把这些数据包弄下来处理呢?我们实际上不需要任何抓包软件,也不需要安装任何证书。使用浏览器开发者工具,配合上一日一技:iOS抓包最简单方案 这篇文章讲到的解析 HAR 文件的方法,可以快速安全获取页面的内容。

首先打开浏览器的开发者工具,勾选上Perserve log复选框,如下图所示:

4000865c3f2a1a322d924d1a90aa4d1b.png

然后刷新页面。注意一定要先打开开发者工具再刷新页面,顺序不能搞反了。接下来,你就正常往下滚动页面或者点击翻页按钮,滚到你不想滚为止。此时开发者工具里面已经有很多数据包了。如下图所示:

48bb9459901b46a1e5bfb307088c1857.png

任何一个数据包上面右键,选择Save all as HAR with content。就会把当前页面的所有数据包全部合并到一个 har 文件里面,如下图所示:

5c9858e28256e267407fe1735e8578e7.png

接下来,使用之前那篇文章中介绍的方法,Python 安装haralyzer库,读取 har 文件,就可以提取出想要的内容了。包含商品列表页的数据包,URL 中含有关键字jingxuan/json_more,所以我们可以使用这个关键词来过滤数据包,如下图所示:

d799751e7741bd88f5d421fe7fd0915d.png

通过分析数据包返回的 JSON,也可以知道商品信息所在的字段,如下图所示:

c298d1a345e207359c927d8f4079e772.png

那么我们就可以开始编写解析的代码了:

import json
from haralyzer import HarParser


har_parser = HarParser.from_file("har文件的地址")
data = har_parser.har_data
entries = data['entries']
for entry in entries:
    req = entry['request']
    url = req['url']
    if 'jingxuan/json_more' not in url:
        continue
    body = entry['response']
    if 'text' not in body['content']:
        continue
    content = body['content']['text']
    info = json.loads(content)
    article_list = info['article_list']
    for article in article_list:
        print(article['article_title'], article['article_price'], article['article_mall'])

运行结果如下图所示,轻轻松松就能解析出数据了。全程不用考虑反爬虫的问题。

ca770a6dc4effa40c6718ef6f6e1e1ac.png

当你要切换到其他网站时,只需要修改代码里面 url 过滤条件和读取 json 对应的字段。其他内容都不需要修改。

好文和朋友一起看~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值