最近突然发现之前写的妹子图的爬虫不能用了,估计是网站又加了新的反爬虫机制,本着追求真理的精神我只好又来爬一遍了!
效果
思路整理
-
获取首页分类标签地址,传入下一步
-
获取每个分类下内容页面地址
-
获取内容页面图片地址以及标题,以页面标题作为文件夹名
最后保存图片就好了
代码
所需包
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~