有时候


只是在人群中多看了一眼


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


小帅b在普通的一天


上着普通的网


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


https://www.mzitu.com/



从此进入了不普通的一天


看着不普通的妹纸


动起了不普通的心思




这么多妹纸


不爬取下来


可惜了


那么


接下来就是


学习 python 的正确姿势



首先我们来分析一下


打开这个妹纸的网站首页


可以看到一共有 211 页



其中


每一页有不同妹纸的主图


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


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


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


够了




我们回到首页


看一下源代码


可以发现


每一页的每一个妹纸都被放在 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/171304https://www.mzitu.com/175090https://www.mzitu.com/171608https://www.mzitu.com/171795https://www.mzitu.com/171041https://www.mzitu.com/175154https://www.mzitu.com/170736https://www.mzitu.com/174947https://www.mzitu.com/174762https://www.mzitu.com/170806https://www.mzitu.com/174433https://www.mzitu.com/174860https://www.mzitu.com/173541https://www.mzitu.com/173063https://www.mzitu.com/173109https://www.mzitu.com/173760https://www.mzitu.com/170563https://www.mzitu.com/170263https://www.mzitu.com/166044https://www.mzitu.com/173721https://www.mzitu.com/168454https://www.mzitu.com/171747https://www.mzitu.com/173845https://www.mzitu.com/173635



下一步


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


当然是要从每个地址进去


获取每个妹纸的所有组图



遍历一下刚刚获取到的 list


    for url in list_page_urls:        download(url)


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


我们需要获取


组图的所有图片数量


组图的名称(真特么sao)


图片的地址



知道了这些信息之后


我们就可以很简单获取了


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


我们运行一下吧



可以看到


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


名字太他妈引入犯罪



小帅b不得不打马赛克


反正你们阅片无数


心中自然无码


打开文件夹可以看到


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


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



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



但其实


发现我们在爬的时候


有点慢了


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


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)


这次我们再爬取试试看



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


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


OMG


我的文件夹






不行了


我赶紧删掉


完整代码


公众号发送「mm」获取吧


警告

本文仅作为学习例子

你别乱来啊


咱们下回见


peace




      点个好看啊~~(破音)