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

有时候html

 

只是在人群中多看了一眼python

 

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

 

小帅b在普通的一天app

 

上着普通的网python爬虫

 

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

 

https://www.mzitu.com/学习

 

 

今后进入了不普通的一天网站

 

看着不普通的妹纸url

 

动起了不普通的心思spa

 

 

 

这么多妹纸

 

不爬取下来

 

惋惜了

 

那么

 

接下来就是

 

学习 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

 

 

 

      点个好看啊~~(破音)

相关文章
相关标签/搜索