想要大量图片怎么办?
经过半天的努力写了个基于搜狗引擎的爬虫,输入想要的图片类型和数量就行。
环境:python3.7,所用软件pycharm
1.先准备好所需要的库
import requests,time,os
from concurrent.futures import ThreadPoolExecutor
2.由于网页源代码没有网址所以得利用抓包工具找到所需网址
https://pic.sogou.com/napi/pc/searchList?mode=1&start={m}&xml_len=48&query={name}
其中m是页码,name是所需的图片名称
3.返回json格式的数据
url = f"https://pic.sogou.com/napi/pc/searchList?mode=1&start={m}&xml_len=48&query={name}"#所需网址
respose = requests.get(url)
respose1 = respose.json()
4.锁定所需图片网址的位置
picurl = respose1["data"]["items"][i]["thumbUrl"]
5.get图片网址将图片转换成二进制格式保存到本地
respose2 = requests.get(picurl,timeout=1)
with open(f"D:\.11111\爬虫\图片\\{name}\\{number}.jpg", "wb") as f:
f.write(respose2.content)
6.在本地文件夹的基础上创建文件将爬取的图片存入当中
def mkdir(path):
path1 ="D:\.11111\爬虫\图片/"
folder = os.path.exists(path1+path)
if not folder: # 判断是否存在文件夹如果不存在则创建为文件夹
os.makedirs(path1+path) # makedirs 创建文件时如果路径不存在会创建这个路径
print("{}文件夹创建成功,正在向文件中存入数据!".format(path))
else:
print("该文件夹已存在,正在向文件中存入数据!")
7.将线程数量定义为爬取速度,为防止ip被封建议开3个就够用了,当然要使用代理ip就可以为所欲为了(不过很不道德)
if __name__ == '__main__':
mkdir(name)
with ThreadPoolExecutor(speed) as t:
for i in range(1,amounts+1):
t.submit(grab, n=i)
8.以下是本人源代码(要想用的话得改个文件名)
import requests,time,os
from concurrent.futures import ThreadPoolExecutor
number = 1
name = input("选择所需要的图片类型:")
amounts = eval(input("设置抓取图片的数量范围(每加1多50张图片):"))
speed = eval(input("设置爬取速度(为了防止被封IP建议不要超过5):"))
def mkdir(path):
path1 ="D:\.11111\爬虫\图片/"
folder = os.path.exists(path1+path)
if not folder: # 判断是否存在文件夹如果不存在则创建为文件夹
os.makedirs(path1+path) # makedirs 创建文件时如果路径不存在会创建这个路径
print("{}文件夹创建成功,正在向文件中存入数据!".format(path))
else:
print("该文件夹已存在,正在向文件中存入数据!")
def grab(n):
global number,amounts
m = n * 48
url = f"https://pic.sogou.com/napi/pc/searchList?mode=1&start={m}&xml_len=48&query={name}"#所需网址
respose = requests.get(url)
respose1 = respose.json()
# print(respose1)
for i in range(48):
picurl = respose1["data"]["items"][i]["thumbUrl"]
try:
respose2 = requests.get(picurl,timeout=1)
with open(f"D:\.11111\爬虫\图片\\{name}\\{number}.jpg", "wb") as f:
f.write(respose2.content)
print("\r第{}张图片爬取成功!".format(number), end='')
number = number + 1
time.sleep(0.5)
except:
continue
if __name__ == '__main__':
mkdir(name)
with ThreadPoolExecutor(speed) as t:
for i in range(1,amounts+1):
t.submit(grab, n=i)
print("\n爬取完毕!")