深度学习 利用爬虫获取自己需要的数据集图片 重命名数据集图片

最近在跑深度学习的代码,电脑正在跑代码,不知道做点什么,就想着如何用爬虫获取自己的数据集,以下内容纯属用来记录自己的学习过程。

1.创建一个Python项目文件

2. 在项目文件的位置cmd

 

3. 防止以后环境混乱,我在这里创建一个anaconda环境

cmd  --->     conda  create -n paChong python==3.7.10

回车/输入y  即可

创建成功 

 4. 更改项目使用的刚才新建的环境

依次打开  File -->  Setting  --> Python Interpreter --> show all

 点击OK应用即可,这样我们这个项目的环境就在创建的paChong虚拟环境中了,接下来安装该项目所需要的依赖和包就不会影响到其他工程了。

5. 激活环境  安装所需的库

conda activate paChong

安装urllib库(这些库可以先不安装,后期根据需要再安装也不迟)

pip install urllib

 报错!! 我查了一下原因,因为在python3中已经将2.x版本的urllib和urllib2两个库合并为一个urllib,所以在3.x环境中无法安装urllib2,如果需要可以安装第三方库urllib3

指定版本安装即可,这里我安装的是urllib==1.23版本(亲测成功)

 安装OpenCV

pip install opencv-contrib-python

 安装pillow

pip install pillow

安装requests库

pip install requests

后期需要用到什么库直接pip安装就好了。 (以上的库都是随便安装的,如果安装过程很慢,只要把下载源改成国内的就行,可以参考这个

 6.查看网页相关信息

由于我是从百度图片上爬虫的,而且百度图片是一个动态网页。

百度图片搜索想要的图片,按F12,进入控制台,查看 网络 --->  Fetch/XHR   左侧由以acjson开头的信息,

点击预览可以看到,每一个jcson文件里data存的30张图片信息,当你继续下滑网页,会继续加载更多的acjson文件。 

 查看acjson文件的标头信息中的pn值,也可以看到以30变化,故此我们其实嵌套两个循环就可以完成这个demo了,第一层访问acjson开头的文件的源代码,第二层就是每张照片的url,最后写入到电脑中。

 

 7.如何获取User-Agent

网页输入:about:version  即可出现下面信息  用户代理即User-agent 复制下来作为Header的一部分

 

 或者 浏览器 按F12   打开控制台   找到网络/network    随便打开左侧的一个文件  查看标头/Headers的强求标头/Request headers,然后就可以找到User-Agent信息。

8.具体实现

import requests
import re
import uuid

headers = {"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.26",  
           "Accept-Encoding": "gzip, deflate, br",
           "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
           "Connection": "keep-alive"}

img_re = re.compile('"thumbURL":"(.*?)"')
img_format = re.compile("f=(.*).*?w")


def file_op(img):
    uuid_str = uuid.uuid4().hex
    tmp_file_name = './DataImages/fire/fire00/%s.jpeg' % uuid_str
    with open(file=tmp_file_name, mode="wb") as file:
        try:
            file.write(img)
        except:
            pass


def xhr_url(url_xhr, start_num=0, page=5):
    end_num = page*30
    for page_num in range(start_num, end_num, 30):
        resp = requests.get(url=url_xhr+str(page_num), headers=headers)
        if resp.status_code == 200:
            img_url_list = img_re.findall(resp.text)  # 这是个列表形式
            for img_url in img_url_list:
                img_rsp = requests.get(url=img_url, headers=headers)
                file_op(img=img_rsp.content)
        else:
            break
    print("内容已经全部爬取")


if __name__ == "__main__":
    org_url = "https://image.baidu.com/search/acjson?tn=resultjson_com&word={text}&pn=".format(text=input("输入你想检索内容:"))
    xhr_url(url_xhr=org_url, start_num=int(input("开始页:")), page=int(input("所需爬取页数:")))

只需要把前面网页的内容找到,然后更改headers和图片的保存路径即可成功爬取。

以下是我爬取的结果:

 

 可以看到爬取到的图片的命名不是自己想要的,甚至有些图片没有用,这时就需要自己手动筛选了。

9.文件重命名

# import os
#
#  方法一  实现命名从0开始
#
# class Rename():
#
#     def __init__(self):
#         self.path = 'E://pythonProject//Pachong_getImages//DataImages//fire//fire00'  # 图片的路径
#
#     def rename(self):
#         filelist = os.listdir(self.path)
#         filelist.sort()
#         total_num = len(filelist)  # 获取文件中有多少图片
#         i = 0000  # 文件命名从哪里开始(即命名从哪里开始)
#         for item in filelist:
#             if item.endswith('.jpeg'):          #  原始图片后缀
#                 src = os.path.join(self.path, item)
#                 dst = os.path.join(os.path.abspath(self.path), str(i) + '.png')         #  改名之后图片后缀
#
#                 try:
#                     os.rename(src, dst)
#                     print('converting %s to %s ...' % (src, dst))
#                     i = i + 1
#                 except Exception as e:
#                     print(e)
#                     print('rename dir fail\r\n')
#
#         print('total %d to rename & converted %d jpgs' % (total_num, i))
#
#
# if __name__ == '__main__':
#     demo = Rename()  # 创建对象
#     demo.rename()  # 调用对象的方法
#


#  方法二  实现命名从 000001 开始

import os
path = "E://pythonProject//Pachong_getImages//DataImages//fire//fire00"
filelist = os.listdir(path)             # 该文件夹下所有的文件(包括文件夹)
count = 1   # 设置图片编号从1开始
for file in filelist:    # 打印出所有图片原始的文件名
    print(file)
for file in filelist:   # 遍历所有文件
    Olddir = os.path.join(path,file)   # 原来的文件路径
    if os.path.isdir(Olddir):   # 如果是文件夹则跳过
        continue
    filename = os.path.splitext(file)[0]   # 文件名
    filetype = os.path.splitext(file)[1]   # 文件扩展名
    Newdir = os.path.join(path,str(count).zfill(6)+filetype)  # 用字符串函数zfill 以0补全所需位数
    os.rename(Olddir,Newdir)    # 重命名
    count += 1

用两种方式实现重命名,我这里使用第二种(第一种命名从1开始,不是我想要的结果)。

实现结果。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值