04网络爬虫-批量下载网站图片

1.获取图片的url

我们以下载搜狗图片网站中的图片为例
1.打开网站 https://pic.sogou.com
在这里插入图片描述
2.搜索一个想下载的图片
在这里插入图片描述
3.按F12打开调试窗口

滑动滚轮翻页, 看看网络请求链接, 我们找找规律
在这里插入图片描述

https://pic.sogou.com/napi/pc/searchList?mode=1&start=48&xml_len=48&query=%E7%8C%AB
https://pic.sogou.com/napi/pc/searchList?mode=1&start=96&xml_len=48&query=%E7%8C%AB
https://pic.sogou.com/napi/pc/searchList?mode=1&start=144&xml_len=48&query=%E7%8C%AB
https://pic.sogou.com/napi/pc/searchList?mode=1&start=192&xml_len=48&query=%E7%8C%AB
https://pic.sogou.com/napi/pc/searchList?mode=1&start=240&xml_len=48&query=%E7%8C%AB

通过观察发现

  • start=48应该是当前页第一张图片的序号
  • xml_len=48应该是一页所包含的图片数(调试发现一页图片最少48张, 最多可100张)
  • query=%E7%8C%AB应该是要搜索的图片关键字

4.打开一个链接看看数据格式

https://pic.sogou.com/napi/pc/searchList?mode=1&start=48&xml_len=48&query=%E7%8C%AB

在这里插入图片描述

我们发现图片的url存储在data变量中, 由oriPicUrl这个键对应

"oriPicUrl":"http://n.sinaimg.cn/translate/20161129/AUZS-fxyawmm3788846.jpg"

2.编写爬虫代码

准备工作做的差不多了
1.先用爬虫访问网址
https://pic.sogou.com/napi/pc/searchList?mode=1&start=48&xml_len=48&query=%E7%8C%AB
获取数据

    url = 'https://pic.sogou.com/napi/pc/searchList?mode=1&start=1&xml_len=48&query=%E7%8C%AB'
    headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.4843.400 QQBrowser/9.7.13021.400'
        }
    # 发送请求,获取数据
    response = requests.get(url, headers=headers)
    content = response.content.decode()
    print(content)

在这里插入图片描述

2.通过正则表达式提取图片url
前一步获取的数据很多, 大部分不是我们需要的, 我们只要图片源文件的url

# 通过正则表达式提取图片url数据
    results = re.findall('"oriPicUrl":"(.*?)",', content) # 返回一个列表
    print(results)

在这里插入图片描述
3.封装成获取图片url的函数

# 获取图片url连接, key是图片类型关键词, num是需要下载的数量, 返回一个存储大量url的数组
def get_image_url(key, page):
    results = []
    for p in range(int(page)):
        url = 'https://pic.sogou.com/napi/pc/searchList?mode=1&start=%d&xml_len=48&query=%s' % (p*48+1, key)
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'
        }
        # 发送请求,获取相应
        response = requests.get(url, headers=headers)
        content = response.content.decode()
        # print(content)
        # 通过正则表达式提取图片url数据
        res = re.findall('"oriPicUrl":"(.*?)",', content)  # 返回一个列表
        results += res
    print(results)
    print("实际搜索到共%d张", len(results))
    return results
# 主函数
if __name__ == '__main__':
    key = input('请输入你要下载图片的关键词:')
    page = input('请问需下载多少页图片(一页48张):')
    get_image_url(key, page)

在这里插入图片描述
4.写一个保存图片的函数

#保存图片至本地, results图片url地址, dir要保存在的文件夹
def save_image(results, dir):
    j = 1
    # 在当目录下创建文件夹
    if not os.path.exists('./' + dir):
        os.makedirs('./' + dir)
    # 下载图片
    for result in results:
        print('正在保存第{}个'.format(j))
        try:
            pic = requests.get(result, timeout=10)
            time.sleep(1) #1s下载一张, 太快容易被封IP
        except:
            print('第{}张图片无法下载'.format(j))
            continue
        # 把图片保存到文件夹
        file_full_name = './' + dir + '/' + str(j) + '.jpg'
        with open(file_full_name, 'wb') as f:
            f.write(pic.content)
        j += 1

3.运行测试

# 配置以下模块
import requests
import re
import os
import time

# 获取图片url连接, key是图片类型关键词, num是需要下载的数量, 返回一个存储大量url的数组
def get_image_url(key, page):
    results = []
    for p in range(int(page)):
        url = 'https://pic.sogou.com/napi/pc/searchList?mode=1&start=%d&xml_len=48&query=%s' % (p*48+1, key)
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'
        }
        # 发送请求,获取相应
        response = requests.get(url, headers=headers)
        content = response.content.decode()
        # print(content)
        # 通过正则表达式提取图片url数据
        res = re.findall('"oriPicUrl":"(.*?)",', content)  # 返回一个列表
        results += res
    print(results)
    print("实际搜索到共%d张", len(results))
    return results

#保存图片至本地, results图片url地址, dir要保存在的文件夹
def save_image(results, dir):
    j = 1
    # 在当目录下创建文件夹
    if not os.path.exists('./' + dir):
        os.makedirs('./' + dir)
    # 下载图片
    for result in results:
        print('正在保存第{}个'.format(j))
        try:
            pic = requests.get(result, timeout=10)
            time.sleep(1) #1s下载一张, 太快容易被封IP
        except:
            print('第{}张图片无法下载'.format(j))
            continue
        # 把图片保存到文件夹
        file_full_name = './' + dir + '/' + str(j) + '.jpg'
        with open(file_full_name, 'wb') as f:
            f.write(pic.content)
        j += 1

# 主函数
if __name__ == '__main__':
    key = input('请输入你要下载图片的关键词:')
    page = input('请问需下载多少页图片(一页48张):')
    res = get_image_url(key, page)
    save_image(res, key)

在这里插入图片描述
下载成功
在这里插入图片描述

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值