Python使用BeautifulSoup爬取妹子图

作者: AwesomeTang | 来源:发表于2018-01-17 22:17 被阅读325次

    最近突然发现之前写的妹子图的爬虫不能用了,估计是网站又加了新的反爬虫机制,本着追求真理的精神我只好又来爬一遍了!

    效果

    文件夹 妹子图

    思路整理

    页面地址:http://www.meizitu.com/

    • 获取首页分类标签地址,传入下一步


      image.png
    • 获取每个分类下内容页面地址


      image.png
    • 获取内容页面图片地址以及标题,以页面标题作为文件夹名


      image.png
    • 最后保存图片就好了


    代码

    所需包
    import os      
    import sys    
    import urllib2
    from bs4 import BeautifulSoup  
    import requests  
    import lxml
    import uuid
    
    获取地址

    首先说BeautifulSoup真的是爬虫利器,不过需要注意这里返回的list,还需要通过for循环读取每个地址。贴一段官方解释:

    Beautiful Soup提供一些简单的、python式的函数来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
    Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。
    Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。

    下面给出的代码是从首页获取每个分类的地址,其他的获取包括图片地址,内容页地址也都是大同小异,然后一直嵌套就可以了。

    def get_mei_channel(url):  
        web_data=requests.get(url)  
        web_data.encoding='gb2312'
        soup=BeautifulSoup(web_data.text,'lxml')
        channel=soup.select('body span a')
        return channel
    ##获取分类地址
    
    保存图片

    这里需要注意的是保存图片的时候需要加上header,应该是网站更新了验证,去年爬妹子图直接保存就可以的。
    文件命名的话我引入了uuid包来生成唯一guid,避免重名保存失败。

    def save_pic(url,path):
        header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
        }
        request = urllib2.Request(url, None, header)
        response = urllib2.urlopen(request)
        filename = path +'/'+str(uuid.uuid1())+'.jpg'
        with open(filename,"wb") as f:
            f.write(response.read())
    ##保存图片,生成唯一guid作为文件名
    
    嵌套

    最后按照思路一步步嵌套起来就可以啦,贴完整代码:

    # -*- coding: utf-8 -*-
    import os      
    import sys    
    import urllib2
    from bs4 import BeautifulSoup  
    import requests  
    import lxml
    import uuid
    
    def judge_folder(path):
        if os.path.isdir(path):
            return False
        else:
            os.mkdir(path)
            return True
    
    def save_pic(url,path):
        header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
        }
        request = urllib2.Request(url, None, header)
        response = urllib2.urlopen(request)
        filename = path +'/'+str(uuid.uuid1())+'.jpg'
        with open(filename,"wb") as f:
            f.write(response.read())
    
    def get_mei_channel(url):  
        web_data=requests.get(url)  
        web_data.encoding='gb2312'
        soup=BeautifulSoup(web_data.text,'lxml')
        channel=soup.select('body span a')
        return channel
    
    def get_mei_info(url):  
        web_data=requests.get(url)  
        web_data.encoding='gb2312'
        soup=BeautifulSoup(web_data.text,'lxml')
        info=soup.select('body div.pic a')
        return info
    
    def get_mei_pic(url):  
        web_data=requests.get(url)  
        web_data.encoding='gb2312'
        soup=BeautifulSoup(web_data.text,'lxml')
        pic=soup.select('body p img')
        titlelist=soup.select('body div h2 a')
        for list in titlelist:
            path_folder = format(list.get_text())
            path = root_folder + path_folder.encode('utf-8') 
            print '创建文件夹>>>'+ path_folder.encode('utf-8') +'>>>'
            if judge_folder(path):
                print '***开始下载啦!!***'
            else:
                pic =[]
                print '***文件夹已存在,即将开始保存下一个页面***'
        return pic ,path
     
    
    def MeiZiTuSpider(url):
        channel_list = get_mei_channel(url)
        for channel in channel_list:
            channel_url = (channel.get('href'))
            channel_title = (channel.get('title'))
            print '***开始查找 '+channel_title.encode('utf-8') +' 分类下的妹子图***'
            info_list = get_mei_info(channel_url)
            for info in info_list:
                info_url = (info.get('href'))
                pic_list,path = get_mei_pic(info_url)
                for pic in pic_list:
                    pic_url = (pic.get('src'))
                    save_pic(pic_url,path)
    
    
    root_folder = 'MEIZITU/'
    url='http://www.meizitu.com/'
    
    if __name__ == "__main__":
        if os.path.isdir(root_folder):
            pass
        else:
            os.mkdir(root_folder)
        MeiZiTuSpider(url)
        print '****MeiZiTuSpider@Awesome_Tang****'
    

    其实还有一步可以做,每个分类页面下目前是只取了第一页的内容,再加一个页码的嵌套的话基本上就可以全部download下来了,不过我盖中盖的Mac吃不消了,有兴趣的可以尝试下~
    另外我把代码打包生成了exe,有兴趣的可以留言或者私信我,我发你^^


    peace~

    相关文章

      网友评论

      • 張無忌:请问:打包 exe 文件,用的哪一个框架?
        AwesomeTang:pyinstaller
      • AwesomeTang:需要exe的可百度云下载,一键下载图片……^_^ 顺便帮忙点个赞~
        链接:https://pan.baidu.com/s/1jJRZGuq 密码:dus8
      • 6de7a2e7aeda:File "F:\test3.py", line 82, in <module>
        MeiZiTuSpider(url)
        File "F:\test3.py", line 60, in MeiZiTuSpider
        channel_list = get_mei_channel(url)
        File "F:\test3.py", line 28, in get_mei_channel
        web_data=requests.get(url)
        File "E:\lib\site-packages\requests\api.py", line 72, in get
        return request('get', url, params=params, **kwargs)
        File "E:\lib\site-packages\requests\api.py", line 58, in request
        return session.request(method=method, url=url, **kwargs)
        File "E:\lib\site-packages\requests\sessions.py", line 508, in request
        resp = self.send(prep, **send_kwargs)
        File "E:\lib\site-packages\requests\sessions.py", line 618, in send
        r = adapter.send(request, **kwargs)
        File "E:\lib\site-packages\requests\adapters.py", line 490, in send
        raise ConnectionError(err, request=request)
        ConnectionError: ('Connection aborted.', error(10054, ''))
        6de7a2e7aeda:@Awesome_Tang 能不能代码直接写好发一下 除了复制粘贴我啥也不知道啊。还有网盘链接无效!
        AwesomeTang:@冥想_1926 :joy: 这个应该是服务器端发现你是爬虫了 主动断开连接了 你可以试下每次爬完sleep几秒
      • 1e5107ef990a:楼主,学习一下
        AwesomeTang:@天干脾燥 互相学习~

      本文标题:Python使用BeautifulSoup爬取妹子图

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