Python使用BeautifulSoup爬取妹子图

简介: 最近突然发现之前写的妹子图的爬虫不能用了,估计是网站又加了新的反爬虫机制,本着追求真理的精神我只好又来爬一遍了!效果文件夹妹子图思路整理页面地址:http://www.

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

效果

img_52a4dfc40f8fe164c81431a87bb2ce29.png
文件夹
img_050c6e7aacc38d93b741800f4ad5d9a0.png
妹子图

思路整理

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

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


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


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


    img_7019f4c35fc884a4bb7dd82ada8fb2e8.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~

目录
相关文章
|
1月前
|
数据采集 JSON 数据格式
python爬虫之app爬取-charles的使用
charles 基本原理,charles抓包,分析,重发。
54 0
|
1月前
|
数据采集 测试技术 API
python爬虫之app爬取-微信朋友圈
搭建appium环境,appium基本使用,API操作等等
80 0
|
4天前
|
数据采集 存储 JSON
Python爬虫面试:requests、BeautifulSoup与Scrapy详解
【4月更文挑战第19天】本文聚焦于Python爬虫面试中的核心库——requests、BeautifulSoup和Scrapy。讲解了它们的常见问题、易错点及应对策略。对于requests,强调了异常处理、代理设置和请求重试;BeautifulSoup部分提到选择器使用、动态内容处理和解析效率优化;而Scrapy则关注项目架构、数据存储和分布式爬虫。通过实例代码,帮助读者深化理解并提升面试表现。
13 0
|
7天前
|
XML 数据采集 自然语言处理
请解释Python中的BeautifulSoup库以及它的主要用途。
BeautifulSoup是Python的HTML/XML解析库,用于数据提取和网页抓取。它提供树形结构解析文档,支持查找、访问和修改元素。主要用途包括网页抓取、数据清洗、自动化测试、内容生成、网站开发及与其他库集成,如Requests和Scrapy。适用于各种数据处理场景。
9 1
|
30天前
|
数据采集 XML 程序员
揭秘YouTube视频世界:利用Python和Beautiful Soup的独特技术
本文介绍了如何使用Python和Beautiful Soup库抓取YouTube视频数据,包括标题、观看次数和点赞、踩的数量。通过亿牛云爬虫代理IP服务避免被网站屏蔽,提供代理服务器配置和请求头设置示例。代码可能需根据YouTube页面更新进行调整。
揭秘YouTube视频世界:利用Python和Beautiful Soup的独特技术
|
1月前
|
数据采集 存储 数据处理
使用Python爬取豆瓣电影影评:从数据收集到情感分析
本文演示如何使用Python爬虫获取豆瓣电影《肖申克的救赎》的影评数据并进行情感分析。首先,安装requests、BeautifulSoup、pandas和TextBlob库。接着,编写爬虫抓取评论的用户名、评分和内容,存储为DataFrame。然后,利用TextBlob进行情感分析,得到情感分数。此方法有助于分析用户对电影的反馈。
86 1
|
1月前
|
XML 数据采集 自然语言处理
请解释Python中的BeautifulSoup库以及它的主要用途。
请解释Python中的BeautifulSoup库以及它的主要用途。
23 0
|
1月前
|
数据采集 存储 安全
python爬虫之app爬取-mitmproxy 的使用
mitmproxy抓包原理,设置代理,MitmDump运用,mitmproxy使用。
38 0
|
1月前
|
数据采集 存储 数据挖掘
Python爬虫实战:打造一个简单的新闻网站数据爬取工具
本文将介绍如何运用Python编写一个简单而高效的网络爬虫,帮助您在实际项目中快速获取并存储新闻网站的数据。通过学习本文,您将了解到如何利用Python中的第三方库和技术来实现数据爬取,为您的数据分析和应用提供更多可能性。
|
1月前
|
数据采集 存储 监控
Python爬虫实战:利用BeautifulSoup解析网页数据
在网络信息爆炸的时代,如何快速高效地获取所需数据成为许多开发者关注的焦点。本文将介绍如何使用Python中的BeautifulSoup库来解析网页数据,帮助你轻松实现数据抓取与处理的技术。