长亭百川云 - 文章详情

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

未闻Code

50

2024-07-13

摄影:产品经理


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

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

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

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

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

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

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

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

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

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

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

`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'])`

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

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

更多每日开发小技巧

尽在****未闻 Code Telegram Channel !

END

未闻 Code·知识星球开放啦!

一对一答疑爬虫相关问题

职业生涯咨询

面试经验分享

每周直播分享

......

未闻 Code·知识星球期待与你相见~

一二线大厂在职员工

十多年码龄的编程老鸟

国内外高校在读学生

中小学刚刚入门的新人

在“未闻 Code技术交流群”等你来!

入群方式:添加微信“mekingname”,备注“粉丝群”(谢绝广告党,非诚勿扰!)

相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2