吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 14816|回复: 96
收起左侧

[Python 转载] python 爬虫2880*1800 等超清妹子图 进程池高效率爬取

  [复制链接]
17788210295 发表于 2019-8-2 16:05
本帖最后由 17788210295 于 2019-8-22 14:18 编辑

利用 pool.map 进程池 高效爬取大图片  大图片的意思就是 最下面那张图....   记的给个评分,评论哟
编码格式为 gb2312
不说了上代码:
[Python] 纯文本查看 复制代码
# coding=gb2312
import requests
from lxml import etree
from multiprocessing import Pool
import os
from time import sleep
import random


class Down_pic():
    def __init__(self):
        self.headers = {
            "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
            "Accept-Encoding": "gzip, deflate",
            "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
            "Cache-Control": "max-age=0",
            "Connection": "keep-alive",
            "Host": "desk.zol.com.cn",
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36",
        }
        self.main_url = 'http://desk.zol.com.cn'  # 主页
        self.dic = {}  # 存放图片路径
        self.count = 0  # 总得图片数量
        self.k = 0  # 用来取datas数据  切片
        self.type = 5  # 大分类取 5个
        self.small_type_num = 4  # 小分类取4个
        self.tupian = 3  # 每一个小分类下载的图片数量 (最多3个)


    def get_tree(self, htlm):
        tree = etree.HTML(htlm)
        return tree

    # 获取大分类
    def get_type(self):
        main_page = requests.get(self.main_url, headers=self.headers).text
        tree = self.get_tree(main_page)
        a_list = tree.xpath('//*[@id="main"]/dl[1]/dd/a')
        # 去掉全部这个分类
        a_list.pop(0)
        for a in a_list[0:self.type]:
            type_name = a.xpath('./text()')[0]
            type_url = self.main_url + a.xpath('./@href')[0]
            yield type_name, type_url

    # 获取小分类
    def get_small_type(self):
        for type_name, type_url in self.get_type():
            small_page = requests.get(type_url)
            small_page.encoding = 'gb2312'
            tree = self.get_tree(small_page.text)
            # 获取小分类
            small_name_list = tree.xpath('//a[@class="pic"]/span/@title')[0:self.small_type_num]  # 小分类取3个
            small_url_list = tree.xpath('//a[@class="pic"]/@href')[0:self.small_type_num]
            self.dic[type_name] = small_name_list
            yield small_url_list

    # 获取图片列表
    def get_pic_list(self):
        for pic_page_url in self.get_small_type():
            for pic_url in pic_page_url:
                url = self.main_url + pic_url
                pic_page = requests.get(url=url).text
                etree = self.get_tree(pic_page)
                pic_list_url = etree.xpath('//*[@id="showImg"]/li/a/@href')
                for pic_url in pic_list_url[:self.tupian]:  # 每一个小分类 取几个图片
                    yield self.main_url + pic_url

    # 获取图片尺寸网址页面
    def get_size(self):
        for pic_url in self.get_pic_list():
            pic_page = requests.get(pic_url).text
            etree = self.get_tree(pic_page)
            try:
                data_url = self.main_url + etree.xpath('//*[@id="tagfbl"]/a[2]/@href')[0]  # 多数默认2880*1800
            except Exception:
                data_url = etree.xpath('//*[@id="bigImg"]/@src')[0]
            yield data_url

    # 获取图片下载地址
    def get_data(self):
        for url in self.get_size():
            data_page = requests.get(url).text
            etree = self.get_tree(data_page)
            try:
                pic_data_url = etree.xpath('/html/body/img[1]/@src')[0]
            except Exception:
                pic_data_url = url
            self.count += 1
            yield pic_data_url
        self.num = self.count

    # 开启线程下载
    def ppp(self):
        print('开启线程')
        pool = Pool(5)
        datas = pool.map(self.download, [url for url in self.get_data()])
        pool.close()
        pool.join()
        for type_name in self.dic:
            for small_name in self.dic[type_name]:
                path = type_name + '/' + small_name
                path = path[:path.find('?')]
                if not os.path.exists(path):
                    os.makedirs(path)
                for data in datas[self.k:self.k + self.tupian]:
                    name = small_name + str(random.randint(1, 1000))  # 图片名
                    pa = path + '/' + name + '.jpg'
                    with open(pa, 'wb') as f:
                        f.write(data)
                self.k += self.tupian
        print('共下载:{}图片'.format(self.count))

    def download(self, url):
        # print('\r当前下载进度:{}%'.format((1 - self.num / self.count) * 100), end='')
        data = requests.get(url=url).content
        sleep(1)
        return data



if __name__ == '__main__':
    down = Down_pic()
    down.ppp()




注:此文章所有内容仅供学习,不允许商用,如有侵权,请联系删除,谢谢。...

多少都有

多少都有
Snipaste_2019-08-02_17-54-56.jpg

免费评分

参与人数 24吾爱币 +21 热心值 +20 收起 理由
dear521520 + 1 + 1 我很赞同!
叶樱枫 + 1 + 1 谢谢@Thanks!
guye燊 + 1 + 1 热心回复!
zhuzhanyang + 1 谢谢@Thanks!
weijh1023 + 1 我很赞同!
GDTOWN + 1 我很赞同!
wuweide + 1 + 1 鼓励转贴优秀软件安全工具和文档!
herbert + 1 + 1 用心讨论,共获提升!
tonikam + 1 + 1 谢谢@Thanks!
linwenhui + 1 + 1 谢谢@Thanks!
炒鸡i + 1 用心讨论,共获提升!
海底泥 + 1 + 1 我很赞同!
Hu2545Hu + 1 凡是我看不懂的,我就认为很牛鼻
阿源小哥哥 + 1 + 1 我很赞同!
android苏林 + 1 谢谢@Thanks!
fyq80715 + 1 + 1 热心回复!
四块大洋 + 1 + 1 谢谢@Thanks!
达云兮 + 1 谢谢@Thanks!
mr.liuc + 1 + 1 谢谢@Thanks!
nokia555 + 1 + 1 我很赞同!
临时小号not404 + 1 + 1 我很赞同!
st0132 + 1 + 1 我很赞同!
tigers_java + 1 + 1 我很赞同!
第一季 + 1 + 1 凡是我看不懂的,我就认为很牛鼻

查看全部评分

本帖被以下淘专辑推荐:

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

you2012 发表于 2019-8-5 19:31
SyntaxError: encoding problem: gb2312  这个是什么问题呢?
hncnxh 发表于 2019-8-2 17:13
 楼主| 17788210295 发表于 2019-8-2 17:57
c00kie 发表于 2019-8-2 16:26
非常适合初学者学习,多谢分享
wsq5201314 发表于 2019-8-2 16:29
看不懂 感觉很厉害的样子
ygr121 发表于 2019-8-2 16:30
这个代码怎么使用?能说一下吗
 楼主| 17788210295 发表于 2019-8-2 16:31
ygr121 发表于 2019-8-2 16:30
这个代码怎么使用?能说一下吗

python 运行就行了呀
丶苍渊丶 发表于 2019-8-2 16:32
有点不太懂 求教各位大佬  复制代码前是要打开别的页面吗   
iyhui 发表于 2019-8-2 16:41
厉害啊,楼主
zhong_xj 发表于 2019-8-2 16:43
看不懂,也不知道是干嘛的,但是觉得很厉害
denverh 发表于 2019-8-2 16:45
不错 装个python跑跑试试看
Franklichao 发表于 2019-8-2 16:52
嗯!可以,适合初学者。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-16 13:23

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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