2021-05-28

利用python,爬取网站的图片
使用 requests 库与 re 模块进行爬虫编写
一、目标数据源分析
本次待抓取的目标地址为:
https://bbs.mihoyo.com/dby/home/47?type=2
该页面为图片列表页,采用下拉浏览器刷新形式进行数据加载。

分析该页面数据,需要借助谷歌浏览器自带的开发者工具,通过 F12 唤醒开发者工具

此时第一个问题出现,该网站使用 JS 调试禁止用户唤醒开发者工具

即网页 JS 注入了下述代码:

(function anonymous() {
  debugger;
});

添加该反爬手段之后,打开开发者工具如下
在这里插入图片描述
解决办法:禁用浏览器 JS 调试,点击开发者工具右侧所示按钮,即可屏蔽该反爬手段
在这里插入图片描述
在这里插入图片描述

抓取目标:
抓取该网站的图片,目标 300 张

用到的 Python 框架为:
requests 库、json 模块

其它技术栈补充:
JSON 格式数据解析

目标网站地址规则:
获取列表页数据规则,通过开发者工具中 Network 视图配合滑动浏览器滚轮操作
在这里插入图片描述
按照1→2→3的顺序滚动浏览器,寻找数据接口,在 Network 视图下捕获浏览器向网站服务器发送的所有数据请求,并查阅浏览器响应

为获取接口,可进行反复测试,直到确定数据所在接口,即在位置 3 的视图中,找到网页中的图片地址或者文字

快速检索接口方式,在开发者工具窗口中,按下 Ctrl+F 按键,唤醒检索工具,输入待查询文字,回车搜索,可直接定位到接口地址
在这里插入图片描述
这是检索数据接口常用的手段之一,需要牢记
最终得到的数据接口:

https://bbs-api.mihoyo.com/post/wapi/getForumPostList?forum_id=47&gids=5&is_good=false&is_hot=false&last_id=6309404&page_size=20&sort_type=2

该接口通过 GET 形式访问,其中参数中可依据名字进行猜测:

page_size:每页数据量,默认是 20;
forum_id:板块 ID,与 URL 地址一致,为 47;
is_good:???
is_hot:是否热门;
last_id:上一条数据 ID;
sort_type:排序类型;
gids:???
继续针对图片详情页进行分析,打开任意详情页,发现最后的数字 6270759 发生了变化,并且该数字可以在列表页接口获取到
通过开发者工具继续捕获接口,得到图片详情页也是基于接口进行数据返回,筛选后得到的接口:

https://bbs-api.mihoyo.com/post/wapi/getPostFull?gids=5&post_id=6270759&read=1

整理需求如下
1.列表页面无法批量生成,需要指定一个起始 ID,下一次的抓取基于该 ID 值;
2.基于列表页接口返回,直接拼接详情页接口;
3.抓取详情页图片数据;
4.保存数据

二、代码实现
本次待爬取的目标网站在编码过程中,发现网站验证了请求头,这是一种最基本的反爬手段
在代码文件中,首先编写通用请求函数,将请求头中的 HOST 提取出来,默认 HOST 设置为 bbs-api.mihoyo.com,该值可通过开发者工具获取
在这里插入图片描述

在这里插入图片描述
使用上面获取到的列表页数据,列表页地址通过 f-strings 形式进行格式化,你也可以使用其它形式,例如 "".format() 或者 % 语法进行格式化字符串
main 函数的起始值

在这里插入图片描述

该接口返回的 JSON 数据格式如下,重要参数为 retcodelast_idlist,数据都存在 list
调用图片内页接口
上述代码最终的目的是得到 post_id 值,因该值是后续接口的必备参数。完善 detail 函数
在这里插入图片描述
声明一个全局变量 total,用于记录爬取图片总数,在获取图片数据时,发现部分图片由于大家都明白的原因涉嫌被哔哔,返回的图片链接包含字符串 weigui.jpg,故针对性进行数据清洗
在这里插入图片描述
迭代爬取
此时代码只爬取一页数据,无法达到 300 张图片目标,修改 main 函数,实现简单递归
在这里插入图片描述
想要在爬取中防止超时,应该添加try-catch跳过,但是还没有想明白添加方法,但是最初的基本目标已经实现:
在这里插入图片描述
接下来研究抛出错误的方法

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值