一、爬取目标
在日常生活或工作中,我们经常需要使用某度图片来搜索相关的图片资源。然而,如果需要批量获取特定关键字的图片资源,手动一个个下载显然是非常繁琐且耗时的。因此,本文将介绍如何使用 Python 爬虫技术批量话下载图片:
二、实现效果
实现批量下载指定关键词的图片,存放到指定文件夹中:
三、准备工作
Python:3.10
编辑器:PyCharm
第三方模块,自行安装:
 pip install requests # 网页数据爬取pip install lxml # 提取网页数据
       复制代码
 四、使用代理
4.1 使用代理的好处?
爬虫使用代理 IP 的好处有以下几点:
轮换 IP 地址:使用代理 IP 可以轮换 IP 地址,降低被封禁的风险,从而保持爬取的连续性和稳定性。
提高采集速度:代理 IP 可以提供多个 IP 地址,使得爬虫能够同时进行多个线程使用,从而加快数据的采集速度。
绕过反爬虫机制:许多网站采取了各种反爬虫机制,例如 IP 封禁、验证码、请求频率限制等。使用代理 IP 可以帮助爬虫绕过这些机制,保持正常的数据采集。
保护个人隐私:使用代理 IP 可以帮助隐藏真实的 IP 地址,保护个人身份和隐私信息。
博主经常写爬虫代码使用的是巨量 IP 家的高匿名代理 IP,每天有 1000 个免费 IP:点击免费试用
4.2 获取免费代理
1、打开巨量 IP 官网:巨量IP官网
2、输入账号信息进行注册:
3、这里需要进行实名认证,如果不会的可以看:个人注册实名教程:
4、进入会员中心,点击领取今日免费 IP:
5、详细步骤看官方的教程文档:巨量HTTP—免费代理ip套餐领取教程,领取后如下图:
6、点击产品管理》动态代理(包时),可以看到我们刚才领取到的免费 IP 信息:
7、将自己电脑的 IP 添加为白名单能获取代理 IP,点击授权信息:
8、依次点击修改授权》快速添加》确定
9、添加完成后,点击生成提取链接:
10、设置每次提取的数量,点击生成链接,并复制链接:
11、将复制链接,复制到地址栏就可以看到我们获取到的代理 IP 了:
五、爬虫实战
5.1 导入模块
 import requests # 爬虫必备import time # 限制爬虫速度import os # 新建指定存储文件夹
       复制代码
 5.2 分析网页
我们右击网页点击插件,可以在 network 中找到图片链接存储的接口:
接下来只需要去构造参数获取接口中的数据,发送请求即可:
5.3 获取图片链接
这里我们创建一个get_img_url(keyword)函数传入关键词,通过添加请求头和 params 表单构造接口参数,发送请求获取图片链接:
 def get_img_url(keyword):    """发送请求,获取接口中的数据"""    # 接口链接    url = 'https://image.baidu.com/search/acjson?'    # 请求头模拟浏览器    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'}    # 构造网页的params表单    params = {        'tn': 'resultjson_com',        'logid': '6918515619491695441',        'ipn': 'rj',        'ct': '201326592',        'is': '',        'fp': 'result',        'queryWord': f'{keyword}',        'word': f'{keyword}',        'cl': '2',        'lm': '-1',        'ie': 'utf-8',        'oe': 'utf-8',        'adpicid': '',        'st': '-1',        'z': '',        'ic': '',        'hd': '',        'latest': '',        'copyright': '',        's': '',        'se': '',        'tab': '',        'width': '',        'height': '',        'face': '0',        'istype': '2',        'qc': '',        'nc': '1',        'fr': '',        'expermode': '',        'force': '',        'cg': 'girl',        'pn': 1,        'rn': '30',        'gsm': '1e',    }    # 携带请求头和params表达发送请求    response  = requests.get(url=url, headers=headers, params=params)    # 设置编码格式    response.encoding = 'utf-8'    # 转换为json    json_dict = response.json()    # 定位到30个图片上一层    data_list = json_dict['data']    # 删除列表中最后一个空值    del data_list[-1]    # 用于存储图片链接的列表    img_url_list = []    for i in data_list:        img_url = i['thumbURL']        # 打印一下图片链接        print(img_url)        img_url_list.append(img_url)    # 返回图片列表    return img_url_list
       复制代码
 
运行结果,控制台打印获取的图片链接:
我们点开一个图片链接查看,的确没问题:
5.4 获取代理
获取到图片链接后我们需要再次发送请求去下载图片,由于请求量一般会很大所以需要用到代理 IP。上面我们已经手动获取到了代理 IP,下面来看 Python 如何挂上代理 IP 发送请求:
1、通过爬虫去获取 API 接口的里面的代理 IP(注意:下面代理 URL,看 4.2 教程换成自己的 API 链接):
 import requestsimport timeimport random
def get_ip():    url = "这里放你自己的API链接"    while 1:        try:            r = requests.get(url, timeout=10)        except:            continue
        ip = r.text.strip()        if '请求过于频繁' in ip:            print('IP请求频繁')            time.sleep(1)            continue        break    proxies = {        'https': '%s' % ip    }
    return proxies
if __name__ == '__main__':    proxies = get_ip()    print(proxies)
       复制代码
 
运行结果,可以看到返回了接口中的代理 IP:
2、接下来我们写爬虫代理的时候就可以挂上代理 IP 去发送请求了,只需要将proxies当成参数传给requests.get函数去请求其他网址:
 requests.get(url, headers=headers, proxies=proxies) 
       复制代码
 5.5 下载图片
图片链接有了,代理 IP 也有了,下面我们就可以下载图片。定义一个get_down_img(img_url_list)函数,传入图片链接列表,然后遍历列表,每下载一个图片切换一次代理,将所有图片下载到指定文件夹:
 def get_down_img(img_url_list):    # 在当前路径下生成存储图片的文件夹    os.mkdir("小姐姐")    # 定义图片编号    n = 0    for img_url in img_url_list:        headers = {            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'}        # 调用get_ip函数,获取代理IP        proxies = get_ip()        # 每次发送请求换代理IP,获取图片,防止被封        img_data = requests.get(url=img_url, headers=headers, proxies=proxies).content        # 拼接图片存放地址和名字        img_path = './小姐姐/' + str(n) + '.jpg'        # 将图片写入指定位置        with open(img_path, 'wb') as f:            f.write(img_data)        # 图片编号递增        n = n + 1
       复制代码
 5.6 调用主函数
主要步骤为明确我们需要获取的关键名,获取指定关键词的图片链接,下载图片到指定位置
 if __name__ == '__main__':    # 1. 修改关键词    keyword = '小姐姐'    # 2. 获取指定关键词的图片链接    img_url_list = get_img_url(keyword)    # 3. 下载图片到指定位置    get_down_img(img_url_list)
       复制代码
 5.7 完整代码
下面完整代码只需要修改关键词和get_ip()函数中的代理 IP 接口链接**(注意:看 4.2 教程换成自己的 API 链接)**
 import requests # 爬虫必备import time # 限制爬虫速度import os # 新建指定存储文件夹
def get_ip():    """获取代理IP"""    # (注意:下面代理URL,看4.2教程换成自己的API链接):    url = "这里放你自己代理IP的API链接"    while 1:        try:            r = requests.get(url, timeout=10)        except:            continue
        ip = r.text.strip()        if '请求过于频繁' in ip:            print('IP请求频繁')            time.sleep(1)            continue        break    proxies = {        'https': '%s' % ip    }
    return proxies
def get_img_url(keyword):    """发送请求,获取接口中的数据"""    # 接口链接    url = 'https://image.baidu.com/search/acjson?'    # 请求头模拟浏览器    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'}    # 构造网页的params表单    params = {        'tn': 'resultjson_com',        'logid': '6918515619491695441',        'ipn': 'rj',        'ct': '201326592',        'is': '',        'fp': 'result',        'queryWord': f'{keyword}',        'word': f'{keyword}',        'cl': '2',        'lm': '-1',        'ie': 'utf-8',        'oe': 'utf-8',        'adpicid': '',        'st': '-1',        'z': '',        'ic': '',        'hd': '',        'latest': '',        'copyright': '',        's': '',        'se': '',        'tab': '',        'width': '',        'height': '',        'face': '0',        'istype': '2',        'qc': '',        'nc': '1',        'fr': '',        'expermode': '',        'force': '',        'cg': 'girl',        'pn': 1,        'rn': '30',        'gsm': '1e',    }    # 携带请求头和params表达发送请求    response  = requests.get(url=url, headers=headers, params=params)    # 设置编码格式    response.encoding = 'utf-8'    # 转换为json    json_dict = response.json()    # 定位到30个图片上一层    data_list = json_dict['data']    # 删除列表中最后一个空值    del data_list[-1]    # 用于存储图片链接的列表    img_url_list = []    for i in data_list:        img_url = i['thumbURL']        # 打印一下图片链接        print(img_url)        img_url_list.append(img_url)    # 返回图片列表    return img_url_list
def get_down_img(img_url_list):    # 在当前路径下生成存储图片的文件夹    os.mkdir("小姐姐")    # 定义图片编号    n = 0    for img_url in img_url_list:        headers = {            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'}        # 调用get_ip函数,获取代理IP        proxies = get_ip()        # 每次发送请求换代理IP,获取图片,防止被封        img_data = requests.get(url=img_url, headers=headers, proxies=proxies).content        # 拼接图片存放地址和名字        img_path = './小姐姐/' + str(n) + '.jpg'        # 将图片写入指定位置        with open(img_path, 'wb') as f:            f.write(img_data)        # 图片编号递增        n = n + 1
if __name__ == '__main__':    # 1. 修改关键词    keyword = '小姐姐'    # 2. 获取指定关键词的图片链接    img_url_list = get_img_url(keyword)    # 3. 下载图片到指定位置    get_down_img(img_url_list)
       复制代码
 
运行结果,生成文件夹,所有图片下载到指定文件夹中:
5.8 免费代理不够用怎么办?
每天免费的 1000 个代理 IP 不够用怎么办?经常写爬虫代码对于代理 IP 需求量很大的小伙伴推荐使用巨量 IP 家的不限量代理 IP 套餐,IP 有效时长:30-60 秒就够用了:点击购买
这里默认有 5 个代理池子,单次最高提取 50,提取 1 秒一次;如果单次提取 1 个,则可以实现 1 秒提取 50 次。如果觉得单次 50 个代理 IP 还不够的可以增加 IP 池子。
我算了一下默认的五个池子,1 秒可以提取 50 个代理 IP,一天 86400 秒,也就是说一天可以提取 50x86400=4,320,000 个代理 IP,好家伙于是博主我果断给自己安排了一个包年套餐,别提有多爽了:
评论