大数据 爬虫Python AI SqlPython,web开发,前端技术分享码农的世界

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

2019-04-25  本文已影响13人  一墨编程学习

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

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:

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

我们需要获取

组图的所有图片数量

组图的名称(真特么sao)

图片的地址

知道了这些信息之后

我们就可以很简单获取了

def download(url):

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

获取到了组图题目 title

根据总页数进行遍历

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

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

接着就可以开始下载了

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

然后将下载的图片放进去


ok

我们运行一下吧

可以看到

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

名字太他妈引入犯罪

不得不打马赛克

反正你们阅片无数

心中自然无码

打开文件夹可以看到

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

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

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

但其实

发现我们在爬的时候

有点慢了

我们来开启多线程试试

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

def download_all_images(list_page_urls):

这次我们再爬取试试看

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

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

OMG

我的文件夹

不行了

我赶紧删掉

如果大家想找一个Python学习环境,可以加入我们的Python学习圈,自己是一名高级python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、人工智能、机器学习等。送给正在学习python的小伙伴!每天会准时的讲一些项目实战案例,分享一些学习的方法和需要注意的小细节,我们的python学习交流q–u--n【 784758214 】,这里是python学习者聚集地,欢迎初学和进阶中的小伙伴!

python专业技术分享

完整代码


# 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)

上一篇 下一篇

猜你喜欢

热点阅读