万能python,用多线程秒爬那些羞羞的妹纸们,纸巾呢?

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

https://www.mzitu.com/

从此进入了不普通的一天

看着不普通的妹纸

动起了不普通的心思

这么多妹纸

不爬取下来

可惜了

那么

接下来就是

首先我们来分析一下

打开这个妹纸的网站首页

可以看到一共有 211 页

其中

每一页有不同妹纸的主图

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

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

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

够了

我们回到首页

看一下源代码

可以发现

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

再来

当我们点击第 2 页的时候

可以发现 URL 变了

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

这个我们遇到很多次了

直接当做变量处理

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

在这里

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

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

def get_page_urls():

在这里 212 页太多了

来获取一页的数据

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

https://www.mzitu.com/171304

下一步

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

当然是要从每个地址进去

获取每个妹纸的所有组图

遍历一下刚刚获取到的 list

for url in list_page_urls:

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

Python学习交流群:556370268,有大牛答疑,有资源共享!有想学习python编程的,想提升自己能力的,欢迎加入讨论学习。

我们需要获取

组图的所有图片数量

组图的名称(真特么sao)

图片的地址

知道了这些信息之后

我们就可以很简单获取了

def download(url):

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

获取到了组图题目 title

根据总页数进行遍历

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

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

接着就可以开始下载了

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

然后将下载的图片放进去

ok

ok

我们运行一下吧

image

可以看到

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

名字太他妈引入犯罪

不得不打马赛克

反正你们阅片无数

心中自然无码

打开文件夹可以看到

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

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

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

但其实

发现我们在爬的时候

有点慢了

我们来开启多线程试试

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

def download_all_images(list_page_urls):

这次我们再爬取试试看

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

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

OMG

我的文件夹

不行了

我赶紧删掉

完整代码

# encoding = utf-8
import concurrent
import os
from concurrent.futures import ThreadPoolExecutor

import requests
from bs4 import BeautifulSoup

def header(referer):
 headers = {
 'Host': 'i.meizitu.net',
 'Pragma': 'no-cache',
 'Accept-Encoding': 'gzip, deflate',
 'Accept-Language': 'zh-CN,zh;q=0.8,en;q=0.6',
 'Cache-Control': 'no-cache',
 'Connection': 'keep-alive',
 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',
 'Accept': 'image/webp,image/apng,image/*,*/*;q=0.8',
 'Referer': '{}'.format(referer),
 }
 return headers

def request_page(url):
 try:
 response = requests.get(url)
 if response.status_code == 200:
 return response.text
 except requests.RequestException:
 return None

def get_page_urls():

 for i in range(1,2):
 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')
 print(url)
 urls.append(url)
 return urls

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

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)

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:
 print(url)
 exector.submit(download,url)

if __name__ == '__main__':
 # 获取每一页的链接和名称
 list_page_urls = get_page_urls()
 download_all_images(list_page_urls)

 如果你依然在编程的世界里迷茫,不知道自己的未来规划,对python感兴趣,这里推荐一下我的学习交流群:556370268,里面都是学习python的,从最基础的python【python,游戏,黑客技术,网络安全,数据挖掘,爬虫】到网络安全的项目实战的学习资料都有整理,送给每一位python小伙伴,希望能帮助你更了解python,学习python

网友:程序员复制粘贴代码却拿着高薪?你们对程序员能力一无所知 

猜你喜欢

转载自blog.csdn.net/weixin_44369414/article/details/89575467