Python多进程妹子图爬虫升级版

可能很多爬虫新手都是从爬取漂亮的妹子开始的,本爬虫新手也是,之前在网上也找到很多爬虫代码,下面讲的爬虫是在之前网友的爬虫的基础上进行了调整。下面就详细介绍这只爬虫。

这个是我爬虫的成果啦,欢迎大家欣赏,哈哈。

妹子秀

一、确认爬虫目标

妹子图:http://www.mzitu.com/all,相信很多人都不陌生,哈哈。网友们的福利啊,既可以学到知识,还可以养养眼,何乐不为呢。

二、明确思路

1、获取每组图片的详细页面,就是url跳转

2、然后获取详细页面内的页码

3、然后把每页的图片的src中的路径临时保存下来

4、启用多进程保存临时保存下来的图片,大功告成,差不多十分钟可以下载一个月的图片,多进程比之前快多了。

三、详细代码

代码主要分为两个模块:

1、获取图片的url

2、多进程下载url

http请求都使用了反爬虫的随机head请求、Referer参数设置,提高爬虫的健壮性。

此程序开箱即用,欢迎大家一起多多交流,微信:Nice-1008

from bs4 import BeautifulSoup

import time

import multiprocessing

import utils

allpic = []

class mzitu():

    ##获取所有的(url、名称)

    def all_url(self, url):

        html = utils.requestpic(url,url)

        #先找到年份

        yy = 2018

        all_year = BeautifulSoup(html.text, 'lxml').find('div', class_='all').find_all('ul', class_='archives')

        #archives

        for year in all_year:

            if(yy==2018):

                all_mouth = year.find_all('li')

                for mouth in all_mouth:

                    if(mouth.find('em').text=="10月"):

                        print(mouth.find('em').text )

                        all_a = mouth.find('p', class_='url').find_all('a')

                    #倒叙处理

                        all_a.reverse()

                        j = 1

                        for a in all_a:

                            title = str(yy)+'年'+mouth.find('em').text+'_'+str(str(j).zfill(2))+'_'+a.get_text()

                            print(title)

                            path = title.replace("?", '_').replace(":", '_')

                            if(utils.mkdir(path)):

                                href = a['href']

                                self.html(path,href)

                            j = j+1

            yy = yy-1


    ##获取页数

    def html(self,title, href):

        html = utils.requestpic(href,href)

        #获取分页的页码

        max_span = BeautifulSoup(html.text, 'lxml').find('div', class_='pagenavi').find_all('span')[-2].get_text()

        for page in range(1, int(max_span) + 1):

            page_url = href + '/' + str(page)

            self.img(title,page_url)


    ##查看每页的内容

    def img(self,title, page_url):

        #print(page_url)

        img_html = utils.requestpic(page_url,page_url)

        temp_url = BeautifulSoup(img_html.text, 'lxml').find('div', class_='main-image')

        if(len(temp_url)>0):

            img_url = temp_url.find('img')['src']

            allpic.append([img_url,title,page_url])

        #self.save(img_url,page_url)


if __name__ == "__main__":

    start = time.time()

    utils.get_ips()

    Mzitu = mzitu() ##实例化

    Mzitu.all_url('http://www.mzitu.com/all')

    start_use = time.time()-start

    start2 = time.time()

    #多进程保存图片

    pool = multiprocessing.Pool(8)

    for pic in allpic:

    pool.apply_async(utils.save, args=(pic[0],pic[1],pic[2], ))##调用img函数

    pool.close()

    pool.join()

    print ('[info]耗时:%s'%(start_use))

    print ('[info]耗时:%s'%(time.time()-start2))


from bs4 import BeautifulSoup

import requests

import os

import random

import subprocess

from win32com.client import Dispatch

base_path = "C:\Develop\\meizitu\mzitu"

ips_list = []

##保存页面中的图片

def save(img_url,folder, page_url):

    print(u'保存图片:'+img_url+" "+folder+" "+page_url)

    name = img_url[img_url.rindex('/')+1:img_url.rindex('.')]

    try:

        img = requestpic(img_url, page_url)

        f = open(base_path+"/"+folder+"/"+name + '.jpg', 'ab')

        f.write(img.content)

        f.close()

    except FileNotFoundError: ##捕获异常,继续往下走

        print(u'图片不存在已跳过:', img_url)

        return False

##保存页面中的图片

def savepic(img_url,title, page_url):

    print(u'保存图片:'+img_url+" "+folder+" "+page_url)

    name = img_url[img_url.rindex('/')+1:img_url.rindex('.')]

    try:

        img = requestpic(img_url, page_url)

        f = open(base_path+"/"+title + '.jpg', 'ab')

        f.write(img.content)

        f.close()

    except FileNotFoundError: ##捕获异常,继续往下走

        print(u'图片不存在已跳过:', img_url)

        return False


##创建文件夹

def mkdir(path):

    path = path.strip()

    isExists = os.path.exists(os.path.join(base_path, path))

    if not isExists:

        print(u'新建文件夹', path)

        os.makedirs(os.path.join(base_path, path))

        os.chdir(os.path.join(base_path, path)) ##切换到目录

        return True

    else:

        print(u'文件夹已存在', path)

        return False               


##发起http请求

def request(url):

    headers = {'User-Agent': "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"}

    content = requests.get(url, headers=headers, proxies={"http": "127.0.0.1:1080"})

    return content

##多个headers请求

def requestpic(url, Referer): ##这个函数获取网页的response 然后返回

    num = 1

    while num<6:

        try:

            user_agent_list = [ \

                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1", \

                "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11", \

                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6", \

                "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6", \

                "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1", \

                "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5", \

                "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5", \

                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3", \

                "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3", \

                "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3", \

                "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3", \

                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3", \

                "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3", \

                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3", \

                "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3", \

                "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3", \

                "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24", \

                "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"

            ]

            #随机头

            ua = random.choice(user_agent_list)

            headers = {'User-Agent': ua,"Referer":Referer} ##较之前版本获取图片关键参数在这里

            #随机ip

            #ip = random.choice(ips_list)

            ip = "127.0.0.1:1080"

            content = requests.get(url, headers=headers, proxies={"http": ip},timeout=3)

        except requests.exceptions.ReadTimeout:

            print('超时'+str(num)+'次,重试')

            num += 1

        except Exception as e:

            print('异常'+str(num)+'次,重试')

            num += 1

        else:

            return content

            break

    else:

        print('超时多次,失败')

##初始化ip池

def get_ips():

    html = request('http://www.xicidaili.com/wn')

    all_lst = BeautifulSoup(html.text, 'lxml').find('table').find_all(class_='odd')

    i=1

    for lst in all_lst:

        if(i<=5):

            all_td = lst.find_all('td')

            ip = str(all_td[1].text)+':'+str(all_td[2].text)

            ips_list.append(ip)

        i=i+1 

if __name__ == "__main__":

    #获取ip池

    #get_ips()


    #随机ip请求

    #html2 = requestpic('http://www.baidu.com',"http://www.baidu.com") 

    #print(html2)


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容