多线程爬取kx1d图片

4 篇文章 0 订阅
0 篇文章 0 订阅
本文介绍了一个使用Python实现的多线程图片下载器。该下载器能够从指定网页抓取图片链接,并通过多线程方式高效下载这些图片到本地指定目录。文中详细展示了如何解析网页内容获取图片URL,以及如何利用线程池来加速下载过程。
摘要由CSDN通过智能技术生成
# -*-coding:utf-8-*-
import os
import shutil
import threading

import lxml.html
import requests

list_href = []


class Download(object):
    current_num = 0

    def __init__(self, output, hf_list):
        self.output = output
        self.hf_list = hf_list
        self._value_lock = threading.Lock()

    def downJpgList(self):
        for jpg_url in self.hf_list:
            print(jpg_url)
            res = requests.get(jpg_url)
            imageFile = open(os.path.join(output, os.path.basename(jpg_url)), 'wb')
            for chunk in res.iter_content(100000):
                imageFile.write(chunk)
            imageFile.close()


def get_url_download(url_page, current_num, total_num):
    global list_href
    url_page_arr = url_page.rsplit('.', maxsplit=1)
    while current_num <= total_num:
        url_page_new = url_page_arr[0] + r'_%s.' + url_page_arr[1]
        current_num += 1
        s_content = requests.get(url_page_new % (current_num))
        tree_html = lxml.html.fromstring(s_content.text)
        href = [img.get('src') for img in tree_html.cssselect('.articleBody  a   img')]
        list_href.extend(href)


def get_url_first_download(url_page):
    global list_href
    s_content = requests.get(url_page)
    tree_html = lxml.html.fromstring(s_content.text)
    href = [img.get('src') for img in tree_html.cssselect('.articleBody  a   img')]
    list_href.extend(href)


def rand_generate():
    import random
    lst = [chr(i) for i in range(97, 123)]
    lst.extend(chr(i) for i in range(65, 91))
    lst.extend(i for i in range(0, 10))
    lst = list(map(str, lst))
    return ''.join(random.sample(lst, 12))


def view_bar(num=1, sum=100, bar_word=':'):
    rate = float(num) / float(sum)
    rate_num = int(rate * 100)
    # print ('\r%{}:'.format(rate_num),end='\n')
    os.write(1, bytes('\r%{}:'.format(rate_num), 'gbk'))
    for i in range(0, num):
        os.write(1, bytes(bar_word, 'gbk'))
        sys.stdout.flush()


if __name__ == '__main__':
    import sys, getopt, random

    # 若没有指定文件名称,默认随机数生成文件名
    outputfile = rand_generate()
    opts, args = getopt.getopt(sys.argv[1:], "hn:o:", ["--name=", "--output="])
    for opt, arg in opts:
        if opt == '-h':
            print('test.py -n <name> -o <outputfile> url_page')
            sys.exit()
        elif opt in ("-n", "--name"):
            model_name = arg
        elif opt in ("-o", "--output"):
            outputfile = arg
    url_page = args[0]
    print('outputfile ', outputfile, 'url_page ', url_page)
    output = os.path.join('I:\chuan\down', outputfile)
    if os.path.exists(output):
        shutil.rmtree(output)
    os.mkdir(output)
    ss = requests.get(url_page)
    ss.encoding = 'utf-8'
    tree = lxml.html.fromstring(ss.text)
    num = tree.cssselect('.pages > span')[0].text_content()
    nums = str(num).split("/")
    current_num = int(nums[0])
    total_num = int(nums[1])
    get_url_first_download(url_page)
    get_url_download(url_page, current_num, total_num)
    downloadThreads = []
    for i in range(5):
        download = Download(output, [href for href in list_href[i::5]])
        downloadThread = threading.Thread(target=download.downJpgList)
        downloadThreads.append(downloadThread)
        downloadThread.start()
    for downloadThread in downloadThreads:
        downloadThread.join()
    print('ok')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值