吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3376|回复: 12
收起左侧

[Python 转载] 多线程美女图片爬虫

[复制链接]
初心701 发表于 2022-4-18 15:11
逛论坛看到了一个爬虫帖子,我也想爬一爬试一试,练习一下
如果代码有可以改进的地方,还请各位大佬指点指点,我学习一下思路

[Python] 纯文本查看 复制代码
# -*- coding = utf-8 -*-
# @Time:2022/4/17 10:05
# @Author:宇
# @File:1111.py
# @Software:PyCharm
import requests
import os
import multiprocessing
from lxml import etree

headers = {
    'Referer': 'https://www.mmlme.com/jp',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 Safari/537.36'
}


# 获取图组链接
def get_zu_urls(pepa):
    zu_title_urls = {}
    url = f'https://www.mmlme.com/jp/page/{pepa}'
    res = requests.get(url=url,headers=headers).text
    tree = etree.HTML(res)
    title = tree.xpath('//div[@class="posts-row ajaxpager"]/posts/div[2]/h2/a/text()')
    # print(len(title))
    urls = tree.xpath('//div[@class="posts-row ajaxpager"]/posts/div[2]/h2/a/@href')
    # print(len(urls))
    for i in range(12):
        zu_title_urls[title[i]] = urls[i]
    # print(zu_title_urls)
    return zu_title_urls


# 得到图片url
def get_urls(urls):
    res = requests.get(url=urls,headers=headers).text
    tree = etree.HTML(res)
    urls_list = tree.xpath('//ul/li/figure/a/@box-img')
    # print(urls_list)
    return urls_list


def save(name, urls_list):
    a = 1
    for i in urls_list:
        res = requests.get(url=i,headers=headers).content
        # print(a)
        with open('图库/' + name + '/' + str(a) + '.jpg', 'wb') as f:
            f.write(res)
        a += 1
    print(name+'下载完成!!!!!!!')


def main():
    for pepa in range(1, 6):
        # 获取图组链接
        print(f'正在下载第{pepa}页......')
        zu_title_urls = get_zu_urls(pepa)
        # 创建文件夹
        if not os.path.exists('图库'):
            os.mkdir('图库')

        for i in zu_title_urls.items():
            if not os.path.exists('图库/'+i[0]):
                os.mkdir('图库/'+i[0])
            print(i[0]+'......')
            # 得到图片url
            urls_list = get_urls(i[1])
            # save(i[0],urls_list)
# 多线程
            save_process = multiprocessing.Process(target=save, args=(i[0],urls_list))
            save_process.start()
        print(f'第{pepa}页' + '下载完成!!!!!!!')


if __name__ == '__main__':
    main()

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
fa00x + 1 + 1 我很赞同!
15504582159 + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

80233 发表于 2022-4-18 20:10
对楼主的代码做了一些修改:
1,引入线程池,可以自定义线程数量,默认为8
2,已下载的图片不再重复下载,如果程序下到一半中途停止,下次运行只下载未下载的图片
3,下载该网站所有页数直到返回404
4,一些细节修改

[Python] 纯文本查看 复制代码
# -*- coding = utf-8 -*-
# @Time:2022/4/17 10:05
# @Author:宇
# @File:1111.py
# @Software:PyCharm
import requests
import os
from lxml import etree
from concurrent.futures import ThreadPoolExecutor


thread_num = 8  # 自定义线程数量


headers = {
    'Referer': 'https://www.mmlme.com/jp',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 Safari/537.36'
}


# 获取图组链接
def get_zu_urls(pepa):
    zu_title_urls = {}
    url = f'https://www.mmlme.com/jp/page/{pepa}'
    res = requests.get(url=url, headers=headers)
    if res.status_code == 404:
        return 0

    tree = etree.HTML(res.text)
    titles = tree.xpath('//div[@class="posts-row ajaxpager"]/posts/div[2]/h2/a/text()')
    urls = tree.xpath('//div[@class="posts-row ajaxpager"]/posts/div[2]/h2/a/@href')

    for title, url in zip(titles, urls):
        zu_title_urls[title] = url

    return zu_title_urls


# 得到图片url
def get_urls(urls):
    res = requests.get(url=urls, headers=headers).text
    tree = etree.HTML(res)
    urls_list = tree.xpath('//ul/li/figure/a/@box-img')

    return urls_list


def save(name, url):
    if not os.path.exists('图库/' + name):
        os.mkdir('图库/' + name)
    # 得到图片url
    urls_list = get_urls(url)
    a = 1
    for i in urls_list:
        jpgpath = '图库/' + name + '/' + str(a) + '.jpg'
        if os.path.exists(jpgpath):
            a += 1
            continue

        res = requests.get(url=i, headers=headers).content
        # print(a)
        with open(jpgpath, 'wb') as f:
            f.write(res)
        a += 1
    print(name + '下载完成!!!!!!!')


def main():
    if not os.path.exists('图库'):
        os.mkdir('图库')
    with ThreadPoolExecutor(max_workers=thread_num) as pool:
        for pepa in range(1, 666):
            # 获取图组链接
            print(f'............正在下载第{pepa}页............')
            zu_title_urls = get_zu_urls(pepa)
            if zu_title_urls == 0:
                break

            for name, url in zu_title_urls.items():
                # save(name, url)
                pool.submit(save, name, url)

    print('全部下载完成')

if __name__ == '__main__':
    main()
15504582159 发表于 2022-4-18 17:16
feiniao 发表于 2022-4-18 17:23
你是我的人 发表于 2022-4-18 17:33
感谢分享
youzijun 发表于 2022-4-18 20:13
学习到了,感谢分享!
cy2931 发表于 2022-4-18 20:40
大佬厉害
zhuguang123 发表于 2022-4-18 23:39
厉害厉害
zs547258574 发表于 2022-4-20 11:31
80233 发表于 2022-4-18 20:10
对楼主的代码做了一些修改:
1,引入线程池,可以自定义线程数量,默认为8
2,已下载的图片不再重复下载 ...

学习到了,多谢~
lcldh 发表于 2022-5-12 11:27
80233 发表于 2022-4-18 20:10
对楼主的代码做了一些修改:
1,引入线程池,可以自定义线程数量,默认为8
2,已下载的图片不再重复下载 ...

感谢楼主和您分享,运行完美。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-1 07:44

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表