使用正则表达式适合于页面源码返回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&copyright=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快多了。

更多推荐

使用正则表达式获取原始图片