美文网首页Python学习互联网科技虫虫
万能python,用多线程秒爬那些羞羞的妹纸们,纸巾呢?

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

作者: 919b0c54458f | 来源:发表于2019-04-26 19:37 被阅读16次

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

    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)
    

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/osaqnqtx.html