有时候
只是在人群中多看了一眼
本文源代码+Q群:700341555获取还可获取python学习资料!
就再也没办法忘掉那些容颜
小帅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/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
恩
下一步
拿到每一页的每个妹纸的地址之后
当然是要从每个地址进去
获取每个妹纸的所有组图
遍历一下刚刚获取到的 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
我的文件夹
不行了
我赶紧删掉
完整代码