最近在跑深度学习的代码,电脑正在跑代码,不知道做点什么,就想着如何用爬虫获取自己的数据集,以下内容纯属用来记录自己的学习过程。
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开始,不是我想要的结果)。
实现结果。