Python学习互联网科技虫虫

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

2019-04-26  本文已影响16人  919b0c54458f

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

https://www.mzitu.com/

image

从此进入了不普通的一天

看着不普通的妹纸

动起了不普通的心思

image

这么多妹纸

不爬取下来

可惜了

那么

接下来就是

image

首先我们来分析一下

打开这个妹纸的网站首页

可以看到一共有 211 页

image

其中

每一页有不同妹纸的主图

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

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

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

够了

image image

我们回到首页

看一下源代码

image

可以发现

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

再来

当我们点击第 2 页的时候

可以发现 URL 变了

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

这个我们遇到很多次了

直接当做变量处理

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

在这里

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

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

def get_page_urls():

在这里 212 页太多了

来获取一页的数据

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

https://www.mzitu.com/171304

下一步

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

当然是要从每个地址进去

获取每个妹纸的所有组图

image

遍历一下刚刚获取到的 list

for url in list_page_urls:

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

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

我们需要获取

组图的所有图片数量

image

组图的名称(真特么sao)

image

图片的地址

image

知道了这些信息之后

我们就可以很简单获取了

def download(url):

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

获取到了组图题目 title

根据总页数进行遍历

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

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

接着就可以开始下载了

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

然后将下载的图片放进去

ok

ok

我们运行一下吧

image

可以看到

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

名字太他妈引入犯罪

不得不打马赛克

反正你们阅片无数

心中自然无码

打开文件夹可以看到

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

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

image

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

image

但其实

发现我们在爬的时候

有点慢了

我们来开启多线程试试

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

def download_all_images(list_page_urls):

这次我们再爬取试试看

image

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

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

OMG

我的文件夹

image

不行了

我赶紧删掉

完整代码

# 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)
上一篇 下一篇

猜你喜欢

热点阅读