记一次痛苦的爬虫经历
type
Post
status
Draft
summary
slug
date
Feb 12, 2023
tags
爬虫
反反爬
Selenium
category
实践技巧
password
icon
URL
Property
Feb 28, 2024 01:10 PM
常规流程爬
- 下载下来打不开
- 发现图片格式不对——图片url为 webp?0
- 文件下载的时候将?0去掉,还是不对,难道是特殊格式?
- 搜索转存方法,将webp文件转为正常的图片格式
# # # 字节保存? # byte_stream = BytesIO(img_resp.content) # 把请求到的数据转换为Bytes字节流 # # print(byte_stream) # roiImg = Image.open(byte_stream) # Image打开Byte字节流数据 # # roiImg.show() # 弹出 显示图片 # imgByteArr = BytesIO() # 创建一个空的Bytes对象 # roiImg.save(imgByteArr, format='PNG') # PNG就是图片格式,我试过换成JPG/jpg都不行 # imgByteArr = imgByteArr.getvalue() # 这个就是保存的图片字节流
- 出现报错,
UnidentifiedImageError: cannot identify image file <_io.BytesIO object at 0x10780a9f0>
- 网上说是pillow库版本的问题,我安装到指定版本,无果
- 观察下下来的图片,发现文件大小全都一样,而且特别小,于是就检查图片保存前的请求响应是否正确,果然,requests相应回来是404,所以图片没有真正被保存
- 对图片网址进行研究,发现图片网址有时效性和关联性:只有原始网站被打开且加载,图片网址才能在同一个浏览器中加载出来(复制到其他浏览器就404,可能是其他浏览器没有原网页的缓存),而且在相同的浏览器中,原网页的缓存时间一过,即使在同一个浏览器中,图片URL也会失效。这个反爬还是做的很牛逼的!!!
- 既然这样,那就上selenium,连夜补了一点selenium的知识
- 在这种情况下(图片的URL已知,但是直接用requests请求的话还是404),只能使用自动操作链来模拟人将图片另存为了
- 但是我的情况特殊,只能保证原网页打开的情况下才能加载出图片网页,所以要先研究selenium新建标签页。
- 这里有个大坑要注意:新建标签页之后一定一定要切换到新建的标签页之后再操作,不然就会错位,我这边出现的情况是
- 右键能出现菜单,但是!!!菜单是原网页的菜单,此时点击【图片存储为】保存下来的是该网站的图标。。。。。。
- 网上找了一圈,文章都一样,基本都是:
- 定位——移动到目标——控制鼠标右击——控制键盘输入v——控制键盘回车
- 但是!!!!!
- selenium最新版的语法变了,有趣官网查文档
- 现在谷歌浏览器在右键图片之后不能输入v来保存图片了,所以只能想其他办法
- 我注意到右键之后还是有反应,于是经过一番研究,在右键之后随意输入一个按键,就可以进入到菜单,此时再控制键盘输入方向键来选择【图片存储为】并输入回车,之后就能弹出图片保存窗口!!!!再输入一次回车之后就保存成功啦!!!
- 设置selenium下载的默认路径,设置selenium无头浏览器(我是用的是操作链方式,会有键盘输入,无头之后输入内容会直接输入到代码编辑器中),设置被识别的风险规避