[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()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章