爬堆糖图的python
少废话,直接上代码吧
python代码
from functools import partial
import requests
import json
import jsonpath
import os
import time
from multiprocessing import Pool
def get_urls(keyword, page):
start = 0
img_urls = []
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'
}
url = 'https://www.duitang.com/napi/blog/list/by_search/'
if not os.path.exists('imgs'):
os.mkdir('imgs')
if not os.path.exists('imgs\\{}'.format(keyword)):
os.mkdir('imgs\\{}'.format(keyword))
for i in range(0, page):
params = {
'kw': keyword,
'start': str(start),
}
response = requests.get(url, headers=headers, params=params)
data = json.loads(response.text)
img_urls += jsonpath.jsonpath(data, '$..path')
start += 24
# print(start)
return img_urls
def img_spider(img_url, keyword):
img = requests.get(img_url).content
with open('imgs\\{}\\{}.jpg'.format(keyword, time.time()), 'wb')as f:
f.write(img)
print(img_url, '下载完成')
if __name__ == '__main__':
keyword = input("请输入关键字:")
page = int(input("请输入爬取页数:"))
urls = get_urls(keyword, page)
# urls.insert(0, keyword)
pool = Pool(4)
start = int(time.time())
pool.map(partial(img_spider, keyword=keyword), urls)
pool.close()
pool.join() # 结束进程
end = int(time.time())
print('====4进程爬取结束====')
print('====用时', end - start, '秒====')
# pool = Pool(10)
# start1 = int(time.time())
# pool.map(partial(img_spider, keyword=keyword), urls)
# pool.close()
# pool.join() # 结束进程
# end1 = int(time.time())
# print('====10进程爬取结束====')
# print('====用时', end1 - start1, '秒====')
代码注释
# 导入所需的模块
from functools import partial
import requests
import json
import jsonpath
import os
import time
from multiprocessing import Pool
# 定义一个函数用于获取图片URL列表
def get_urls(keyword, page):
start = 0 # 初始化开始索引为0
img_urls = [] # 初始化一个空列表用于存储图片URL
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'
} # 设置请求头
url = 'https://www.duitang.com/napi/blog/list/by_search/' # 目标网站的API接口
# 检查并创建存储图片的文件夹
if not os.path.exists('imgs'):
os.mkdir('imgs')
if not os.path.exists('imgs\\{}'.format(keyword)):
os.mkdir('imgs\\{}'.format(keyword))
# 循环爬取指定页数的图片URL
for i in range(0, page):
params = {
'kw': keyword, # 搜索关键词
'start': str(start), # 开始索引
}
response = requests.get(url, headers=headers, params=params) # 发送GET请求
data = json.loads(response.text) # 解析返回的JSON数据
img_urls += jsonpath.jsonpath(data, '$..path') # 使用jsonpath提取图片路径
start += 24 # 更新开始索引,每次增加24,以便获取下一批数据
return img_urls # 返回图片URL列表
# 定义一个函数用于下载并保存图片
def img_spider(img_url, keyword):
img = requests.get(img_url).content # 发送GET请求获取图片内容
# 使用当前时间戳和关键词构造文件名,并保存图片
with open('imgs\\{}\\{}.jpg'.format(keyword, time.time()), 'wb') as f:
f.write(img)
print(img_url, '下载完成')
# 程序主入口
if __name__ == '__main__':
keyword = input("请输入关键字:") # 提示用户输入搜索关键词
page = int(input("请输入爬取页数:")) # 提示用户输入要爬取的页数
urls = get_urls(keyword, page) # 调用get_urls函数获取图片URL列表
# 创建一个进程池,用于并行下载图片
pool = Pool(4)
start = int(time.time()) # 记录开始时间
# 使用pool.map方法并行下载图片,partial用于固定keyword参数
pool.map(partial(img_spider, keyword=keyword), urls)
pool.close() # 关闭进程池
pool.join() # 等待所有进程结束
end = int(time.time()) # 记录结束时间
print('====4进程爬取结束====') # 打印爬取结束信息
print('====用时', end - start, '秒====') # 打印用时信息