[python爬虫] 使用多进程爬取妹子图

导包

import re,os,time
from piaot import *
from multiprocessing import Pool

获得网页页数数量

def mnshoye():

    # 主页
    url='http://www.mzitu.com/'

    # 自定义包
    req=yc(url)
    html=req.decode('utf-8')
    # print(html)
    # 正则
    xz = r'<a title=".*?" href="(.*?)">(.*?)</a>'
    ll = re.compile(xz)
    html_1=ll.findall(html)
    # print(html)
    return html_1

主函数

def zhu():
    print('欢迎来到妹子图库!(^-^)')
    # 调用函数mnshoye
    x = mnshoye()

    # 循环出每一列的名称

    print('请输入需要爬的分类(编号):')

    p=0
    for i in x[1:6]:
        p+=1
        print(p,':',i[1],'  ',end='')


    # 输入分类名
    name=int(input('-->>'))

    print('请问爬取页?')

    shu=int(input('-->>'))

    if name == 1:
        mz_li(x[1][0],shu,x[1][1])
    elif name == 2:
        mz_li(x[2][0],shu,x[2][1])
    elif name == 3:
        mz_li(x[3][0],shu,x[3][1])
    elif name == 4:
        mz_li(x[4][0],shu,x[4][1])
    elif name == 5:
        mz_li(x[5][0],shu,x[5][1])
    else:
        print('抱歉!,你输入的值我们查询不到请重新输入')
        zhu()

创建文件

def mz_li(url,jshu=1,name=None):

    for i in range(jshu):

        url=url+'page/{}/'.format(i+1)

        # 请求其中的分类内容
        nr=yc(url)
        html=nr.decode('utf-8')

        # 正则过滤
        zc = r'<li><a href="(.*?)".*alt=\'(.*?)\'.*</span></li>'
        ss = re.compile(zc)
        html = ss.findall(html)

        # 判断是否是我们希望的页面
        if html == [''] or []:

            # 如果不是重新调用
            mz_li(url,jshu,name)

        else:

            # 循环
            for j in html:
                # 判断是否在文件夹名称
                b = 'C:/Users/黑神/Desktop/pc_zy/妹子图/'+str(name) +'/'+ j[1]

                # 判断当前路径是否存在,没有则创建new文件夹
                if not os.path.exists(b):
                    print('正在创建文件夹:路径C:/Users/黑神/Desktop/pc_zy/妹子图/'+j[1])
                    # 执行存储
                    os.makedirs(b)

                    print('创建成功....')

                    # 文件夹创建完毕后调用爬取图片函数,将url传过去
                    pq_tupian_yeshu(j[0],name)
                    # print('爬取完成!')

    return '爬取完毕!'

获得网页数量

def pq_tupian_yeshu(url,name):
    print(url)
    print('开始爬取图片')

    # 调用自定义包
    req=yc(url)

    html=req.decode('utf-8')

    # 正则
    x = r'<span>(\d*?)</span>'
    ss=re.compile(x)
    html=ss.findall(html)

    # 判断是否是我们希望的页面
    if html == ['']:

        # 如果不是重新调用
        pq_tupian_yeshu(url,name=name)

    else:
        a=[]
        # 因为获取的值是字符串类型需要转换成int整型
        for i in html:
            a.append(int(i))

        # 进程池
        p=Pool(3)
        # 循环页数,将最大的页数当也结束值
        for i in range(1,max(a)+1):

            if i == 1:
            # 拼接地址循环页数
                url_tp=url
            else:
                url_tp = url +'/'+ str(i)
            # print(url_tp)
            p.apply_async(pq_tp,(url_tp,name))
            # pq_tp(url_tp,name)
        # # 关闭进程池,停止接受其它进程
        p.close()
        # # 阻塞进程
        p.join()

爬取图片

def pq_tp(url,name):

    print(url)
    html=yc(url)
    html=html.decode('utf-8')
    # 正则
    x = r'<img src="(.*?)" alt="(.*?)" /></a></p>'
    ss = re.compile(x)
    html = ss.findall(html)

    # 判断是否是我们希望的页面
    if html == []:
        pq_tp(url,name)
    else:
        print(html[0][0])
        # 反爬虫,添加表头和Referer
        tox ={'User-Agent':pa(),'Referer':url}

        print('开始下载中......')
        # 自定义包
        data=yc(html[0][0],tox=tox)

        print('下载完毕!')
        # 保存的地址
        dz='C:/Users/黑神/Desktop/pc_zy/妹子图/'+str(name)+'/'+html[0][1]+'/'+str(time.strftime('%Y%m%d%H%M%S', time.localtime(time.time())))+'.jpg'
        print(dz)

        # 保存到文件
        with open(dz,'wb') as f:
            f.write(data)

if name==’main‘:
zhu()

展开阅读全文

没有更多推荐了,返回首页