爬堆糖图的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, '秒====')  # 打印用时信息

消息盒子

# 暂无消息 #

只显示最新10条未读和已读信息