使用正则表达式适合于页面源码返回JSON数据,无论是在HTML里还是在<SCRIPT>里,只要返回页面源码,可以查找到,就可以通过正则表达式去获取。
正则表达式获取的优点:不需要解密,因为页面返回效果已经解密了,不用再去扣JS代码,方便快捷。
正则表达式获取的缺点:熟练掌握正则表达式语法及处理方法。
1、分页某搜索平台图片页面返回源代码,可以查找到有以下代码段:
2、其中app.setData('imgData':{});这一段就是数据,通过正则表达则把它截取出来转成JSON数据,里面的objURL就是原始图片地址,而且是已经解密的。如果你通过扣JS代码的话,可能你需要找到它的解密函数,非常麻烦
3、以下是获取图片的代码:
import jsonpath
import requests
import re
import json
url = f'https://某搜索平台/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1652068104171_R&pv=&ic=0&nc=1&z=0&hd=0&latest=0©right=0&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&dyTabStr=&ie=utf-8&sid=&word=壁纸图片'
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Host': 'image.baidu',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36'
}
try:
response = requests.get(url=url, headers=headers)
response.encoding = response.apparent_encoding
# 使用正则表达式获取js里的json数据
r = re.findall("'imgData',(.*?)[)][;]", response.text, re.S)
string = ''.join(r)
info_dict = json.loads(string)
# 使用jsonpath类来解析json数据
img_urls = jsonpath.jsonpath(info_dict, '$..objURL')
成功获得图片数组,然后循环访问,保存。
4、保存图片
import io
import os
import uuid
from PIL import Image
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36',
'content-type': 'image/webp',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Accept-Ranges': 'bytes',
'Accept-Encoding': 'gzip, deflate, br'
}
for img_url in img_urls:
res = requests.get(img_url, headers=headers).content
# 将bytes结果转化为字节流
byte_stream = io.BytesIO(res)
# 使用图像库Image打开Byte字节流数据
Img = Image.open(byte_stream)
# 创建一个空的Bytes对象
imgByte = io.BytesIO()
# PNG就是图片格式,JPG/jpg都不行
Img.save(imgByte, format='PNG')
# 这个就是保存的图片字节流
imgByte = imgByte.getvalue()
index = uuid.uuid1()
if not os.path.exists(r'./{}'.format('壁纸图片')):
os.mkdir(r'./{}'.format('壁纸图片'))
with open(r'./{}/{}.jpg'.format('壁纸图片', index), 'wb') as f:
f.write(imgByte)
print(r'***正在下载: {}.jpg'.format(index))
成功保存,比扣JS快多了。
更多推荐
使用正则表达式获取原始图片
发布评论