python爬虫15 | 害羞,用多线程秒爬那些万恶的妹纸们,纸巾呢?

有时候

只是在人群中多看了一眼

就再也没办法忘掉那些容颜

小帅b在普通的一天

上着普通的网

不小心打开了一个不太普通的网站

https://www.mzitu.com/

python爬虫15 | 害羞,用多线程秒爬那些万恶的妹纸们,纸巾呢?

从此进入了不普通的一天

看着不普通的妹纸

动起了不普通的心思

python爬虫15 | 害羞,用多线程秒爬那些万恶的妹纸们,纸巾呢?

这么多妹纸

不爬取下来

可惜了

那么

接下来就是

学习 python 的正确姿势

 

python爬虫15 | 害羞,用多线程秒爬那些万恶的妹纸们,纸巾呢?

首先我们来分析一下

打开这个妹纸的网站首页

可以看到一共有 211 页

python爬虫15 | 害羞,用多线程秒爬那些万恶的妹纸们,纸巾呢?

其中

每一页有不同妹纸的主图

再点击进去就是每个妹纸的详情组图

每一个妹纸的组图中的图片数量不同

比如其中一个妹纸就有 46 张

够了

python爬虫15 | 害羞,用多线程秒爬那些万恶的妹纸们,纸巾呢?

python爬虫15 | 害羞,用多线程秒爬那些万恶的妹纸们,纸巾呢?

我们回到首页

看一下源代码

python爬虫15 | 害羞,用多线程秒爬那些万恶的妹纸们,纸巾呢?

可以发现

每一页的每一个妹纸都被放在 li 标签里面了

再来

当我们点击第 2 页的时候

可以发现 URL 变了

https://www.mzitu.com/page/2/

 

这个我们遇到很多次了

直接当做变量处理

所以第一个思路就是拿到每一个页面的所有妹纸的地址

在这里

我们可以使用 for 循环来获取每一页的内容

bs4 获取每一个地址然后放到 urls 里面去

def get_page_urls():

    for i in range(1,212):
        baseurl = 'https://www.mzitu.com/page/{}'.format(i)
        html = request_page(baseurl)
        soup = BeautifulSoup(html, 'lxml')
        list = soup.find(class_='postlist').find_all('li')
        urls=  []
        for item in list:
            url =item.find('span').find('a').get('href')
            urls.append(url)
    return urls

在这里 212 页太多了

小帅b来获取一页的数据

运行一下得到第一页每个妹纸的 URL

https://www.mzitu.com/171304
https://www.mzitu.com/175090
https://www.mzitu.com/171608
https://www.mzitu.com/171795
https://www.mzitu.com/171041
https://www.mzitu.com/175154
https://www.mzitu.com/170736
https://www.mzitu.com/174947
https://www.mzitu.com/174762
https://www.mzitu.com/170806
https://www.mzitu.com/174433
https://www.mzitu.com/174860
https://www.mzitu.com/173541
https://www.mzitu.com/173063
https://www.mzitu.com/173109
https://www.mzitu.com/173760
https://www.mzitu.com/170563
https://www.mzitu.com/170263
https://www.mzitu.com/166044
https://www.mzitu.com/173721
https://www.mzitu.com/168454
https://www.mzitu.com/171747
https://www.mzitu.com/173845
https://www.mzitu.com/173635

下一步

拿到每一页的每个妹纸的地址之后

当然是要从每个地址进去

获取每个妹纸的所有组图

python爬虫15 | 害羞,用多线程秒爬那些万恶的妹纸们,纸巾呢?

遍历一下刚刚获取到的 list

    for url in list_page_urls:
        download(url)

那么进入一个妹纸的详情页面的时候

我们需要获取

组图的所有图片数量

python爬虫15 | 害羞,用多线程秒爬那些万恶的妹纸们,纸巾呢?

 

组图的名称(真特么sao)

python爬虫15 | 害羞,用多线程秒爬那些万恶的妹纸们,纸巾呢?

图片的地址

python爬虫15 | 害羞,用多线程秒爬那些万恶的妹纸们,纸巾呢?

知道了这些信息之后

我们就可以很简单获取了

def download(url):
    html = request_page(url)
    soup = BeautifulSoup(html, 'lxml')
    total = soup.find(class_='pagenavi').find_all('a')[-2].find('span').string
    title = soup.find('h2').string
    image_list = []
    for i in range(int(total)):
        html = request_page(url + '/%s' % (i + 1))
        soup = BeautifulSoup(html, 'lxml')
        img_url = soup.find('img').get('src')
        image_list.append(img_url)
    download_Pic(title, image_list)

在这里我们获取了 total 总页数

获取到了组图题目 title

根据总页数进行遍历

一个页面可以获取到组图中的一张图片

然后我们把这些图片都放到组图集合中

接着就可以开始下载了

我们可以根据这个组图的名字来创建文件夹

然后将下载的图片放进去


def download_Pic(title, image_list):
    # 新建文件夹
    os.mkdir(title)
    j = 1    # 下载图片
    for item in image_list:
        filename = '%s/%s.jpg' % (title,str(j))
        print('downloading....%s : NO.%s' % (title,str(j)))
        with open(filename, 'wb') as f:
            img = requests.get(item,headers=header(item)).content
            f.write(img)
        j+=1


ok

我们运行一下吧

python爬虫15 | 害羞,用多线程秒爬那些万恶的妹纸们,纸巾呢?

可以看到

每张图片都被我们爬下来了

名字太他妈引入犯罪

python爬虫15 | 害羞,用多线程秒爬那些万恶的妹纸们,纸巾呢?

小帅b不得不打马赛克

反正你们阅片无数

心中自然无码

打开文件夹可以看到

每一个美女都根据组图生成文件夹

每个文件夹就是组图里面的图片

python爬虫15 | 害羞,用多线程秒爬那些万恶的妹纸们,纸巾呢?

我这马赛克打得是不是很棒?

python爬虫15 | 害羞,用多线程秒爬那些万恶的妹纸们,纸巾呢?

但其实

发现我们在爬的时候

有点慢了

还记不记得上次摸鱼提到的多线程?

python爬虫14 | 就这么说吧,如果你不懂多线程和线程池,那就去河边摸鱼!

我们来开启多线程试试

根据我们一开始获取到每个页面的多个妹纸的 URL 来使用线程池

def download_all_images(list_page_urls):
    # 获取每一个详情妹纸
    works = len(list_page_urls)
    with concurrent.futures.ThreadPoolExecutor(works) as exector:
        for url in list_page_urls:
            exector.submit(download,url)

这次我们再爬取试试看

python爬虫15 | 害羞,用多线程秒爬那些万恶的妹纸们,纸巾呢?

可以看到这次就不是一组一组的爬了

而是多个线程同时爬取多个组图

OMG

我的文件夹

python爬虫15 | 害羞,用多线程秒爬那些万恶的妹纸们,纸巾呢?

不行了

我赶紧删掉

完整代码

公众号发送「mm」获取吧

警告

本文仅作为学习例子

你别乱来啊

咱们下回见

peace

python爬虫15 | 害羞,用多线程秒爬那些万恶的妹纸们,纸巾呢?

 

      点个好看啊~~(破音)

python爬虫15 | 害羞,用多线程秒爬那些万恶的妹纸们,纸巾呢?

原文始发于微信公众号(学习python的正确姿势):python爬虫15 | 害羞,用多线程秒爬那些万恶的妹纸们,纸巾呢?

One Reply to “python爬虫15 | 害羞,用多线程秒爬那些万恶的妹纸们,纸巾呢?”

发表回复