zoukankan      html  css  js  c++  java
  • python爬虫15 | 害羞,用多线程秒爬那些万恶的妹纸们,纸巾呢?

    有时候

     

    只是在人群中多看了一眼

     

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

     

    小帅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/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

     

     

     

          点个好看啊~~(破音)

     

  • 相关阅读:
    多线程、方便扩展的Windows服务程序框架
    C#并行开发_Thread/ThreadPool, Task/TaskFactory, Parallel
    C#并行编程-Task
    C#线程篇---Task(任务)和线程池不得不说的秘密(5)
    C# 线程知识--使用Task执行异步操作
    C# 线程池执行操作例子
    c#子线程执行完怎么通知主线程
    C#子线程执行完后通知主线程
    再送一波干货,测试2000线程并发下同时查询1000万条数据库表及索引优化
    熵的函数为什么用H,而熵的英文是entropy,好像没关系。实际原因是
  • 原文地址:https://www.cnblogs.com/fxxkpython/p/10832211.html
Copyright © 2011-2022 走看看