相关库:requests、bs4、urllib(scrapy库安装失败,懒的折腾了,没使用)
成果:
主要思路借鉴博客https://blog.csdn.net/mockingbirds/article/details/72854243
一、获取主页性感分类中每页的链接
二、获取当前页中主题的链接和主题名称
三、获取每个主题中的图片链接
四、逐个下载图片并按照主题名称分类保存
上文的博客讲的很详细了。这里就不详细讲了,本文代码在文章最后。主要经验教训:
一、上述第三步中,下载网页内容进行图片地址解析时,最好用requests库,不要用urlib。虽然大部分网页能正常解析,但是个别网页会显示乱码,这样地址解析时会报错。这是一个大坑,找了半天才发现
二、上述第四步中,下载图片使用函数requests.get(image_url,headers=header),不要使用urllib.urlretrieve(image_url,file_name)。因为这个网站有一个简单的反爬虫方法,就是根据headers。使用后一个函数下载的图片是404错误图片。头的内容只需要referer和User-Agent即可。
三、采用网站中的主题名建立文件夹,将该主题下的图片都放入文件夹中。网站上的主题名有的含有冒号,建立文件夹的时候回报错,需要将冒号替换掉
完整代码如下
#coding=utf-8
#爬取http://www.mzitu.com/xinggan/网站图片,遍历
import urllib
import requests
from bs4 import BeautifulSoup
import os
header={
'Referer': 'http://www.mzitu.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
}
class GetSexGirl(object):
#获取所有页数的地址
def get_all_urls(self):
urls_list = []
for i in range(1,82):
url = "http://www.mzitu.com/xinggan/page/%s"%i
urls_list.append(url)
return urls_list
#获取当前页中所有主题的地址和主题名称
def get_title_urls(self,url):
map_title_url = {}
response = requests.get(url,header)
html =response.text
soup=BeautifulSoup(html)
mytag=soup.select('#pins span a')
size = len(mytag)
for i in range(size):
url=mytag[i].attrs['href']
title=mytag[i].get_text()
map_title_url[url] = title
#print i,': ',url,title
return map_title_url
# 获取当前主题下的所有图片url
def get_image_urls(self,titleurl):
response = requests.get(titleurl)
response.encoding = 'utf-8'
html = response.text
soup=BeautifulSoup(html)
mytag=soup.select('.pagenavi span ')
pagenum=int(mytag[6].get_text())#得到当前主题中的图片总页数
mytag=soup.select('.main-image img ')[0]
url1= mytag.attrs['src']
#http://i.meizitu.net/2018/04/21c01.jpg
url0= url1[0:32]
imag_url_list = []
for i in range(1,pagenum+1):
url=url0+'%02d.jpg' % i
imag_url_list.append(url)
print i,url
return imag_url_list #通过循环得到当前主题中的所有图片地址
# 下载给定url的图片到本地
def download_image(self, base_dir, image_url):
#print('basedir is :'+base_dir+' image_url is :'+image_url)
image_name = image_url[-9:-4]
# 获取图片的名称, image_url = http://i.meizitu.net/2017/04/24b01.jpg 这种格式
#要保存到的目标文件名=文件目录+图片编号+后缀名
file_name = base_dir+"\%s.jpg"%image_name
print 'file_name is :%s'%file_name, 'image_url is :%s'%image_url
# urllib.urlretrieve(image_url,file_name)
try:
img_response = requests.get(image_url, headers=header)
except:
return
if img_response.status_code!=404:
f = open(file_name, 'wb')
f.write(img_response.content) # 多媒体文件要是用conctent
f.close()
return
if __name__ == '__main__':
get_sex_girl = GetSexGirl()
mian_page_urls_list=get_sex_girl.get_all_urls()#获取所有页的地址
mian_page_num=len(mian_page_urls_list)
for i in range(0,mian_page_num-1):
print 'page',i+1
mian_page_urls=mian_page_urls_list[i]##获取当前页的地址
map_title_url=get_sex_girl.get_title_urls(mian_page_urls)
title_urls_list=map_title_url.keys()##获取当前页的所有主题地址
title_num=len(title_urls_list)
for k in range(0,title_num-1):
title_url=title_urls_list[k]#当前的主题地址
title_name=map_title_url[title_url]#获取当前主题名称
print '主题:',title_name
imag_url_list=get_sex_girl.get_image_urls(title_urls_list[k])#获取所有图片地址
imag_num=len(imag_url_list)
title_name=title_name.replace(':','')#将其中的冒号替换掉,否则无法建立文件夹
base_dir = os.path.abspath('.')+r'\%s%s'%(i+1,title_name)
if os.path.exists(base_dir) == False:
print ' 该主题文件夹不存在, 创建:', base_dir
# 创建文件夹存放图片
os.makedirs(base_dir)
for m in range(0,imag_num-1):
image_url=imag_url_list[m]
get_sex_girl.download_image(base_dir, image_url)