python爬取美女图片

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Martin201609/article/details/53260085

python爬取美女图片

1、系统环境信息

Windows10 64bit
Python 2.7.12
爬取网址:www.mm131.com

2、具体步骤

  1. 查看网页具体信息,分析源代码
    导航栏,主要分四个模块

这里写图片描述
查看源代码:

<div class="nav">
   <ul>
      <li><a href='http://www.mm131.com/'>首页</a></li>
      <li><a href='http://www.mm131.com/xinggan/'>性感美女</a></li>
      <li><a href='http://www.mm131.com/qingchun/'>清纯美眉</a></li>    
      <li><a href='http://www.mm131.com/xiaohua/'>美女校花</a></li>
      <li><a href='http://www.mm131.com/chemo/'>性感车模</a></li>
      <li><a href='http://www.mm131.com/qipao/'>旗袍美女</a></li>
      <li><a href='http://www.mm131.com/mingxing/'>明星写真</a></li>
   </ul>
</div>

Nav模块对应的页面特点:
每个大模块下对应了很多的页面,通过下方的页表栏确定
而每个当前的页面,则是每个MM的个人图集的主页
这里写图片描述

每个人物描述,是一个MM主页,而包行多少页面呢?
这里写图片描述

我们可以通过分析 “末页“所在的页面的数量,找到这个模块下的所有的总页数

<a href='list_5_2.html' class="page-en">下一页</a><a href='list_5_8.html' class="page-en">末页</a></dd>

查找到”末页“,然后观察现象,末尾页对应的时list_5_8.html这个网页
观察每个html,可以知道,总的页数就是list_5_8中对应的8的数字。
通过找到这个标签连接,通过对list_5_8.html进行字符串分割,从而可以找到总的页数

涉及使用的代码:

中文匹配:
#匹配中文  末页 \xe6\x9c\xab\xe9\xa1\xb5'
abc = '<a href="list_6_81.html" class="page-en">末页</a>'
xx = u'\xe6\x9c\xab\xe9\xa1\xb5'
pattern = re.compile(xx)
res = pattern.findall(str)
print "res",res[0]
#\xe6\x9c\xab\xe9\xa1\xb5 是 末页 这两个汉字在我的电脑显示的方式。 通过它进行中文的匹配
#字符串分割:
 xx = u'\xe4\xb8\x8b\xe4\xb8\x80\xe9\xa1\xb5</a><a href=\'list(.*?).html.*\xe6\x9c\xab\xe9\xa1\xb5</a>'  #下一页\xe4\xb8\x8b\xe4\xb8\x80\xe9\xa1\xb5 末页 \xe6\x9c\xab\xe9\xa1\xb5中文
    pattern = re.compile(xx,re.S)
    res = pattern.findall(content)
    #print res
    totalCount = int(res[0].split('_')[-1])
    print totalCount
#totalCount就是最后一位 8     

从而通过总页数,获取MM的所有的个人主页的url信息
从而对每一个MM主页URL信息,进入,获取MM图片的链接。 从而通过连接,获取图片

2.整体代码结构,源代码记录之


# -*- encoding:utf8 -*-
import re
import sys
import urllib2
import urllib
import os

def getNavTotalURL():  #获取每个导航栏模块下的所有页面URL,存放到list表中。
    #url = 'http://www.mm131.com/mingxing/'
    url = 'http://www.mm131.com/mingxing/'
    response = urllib2.urlopen(url)
    content = response.read().decode('GBK').encode('utf8')
    #content = '''<a href='list_6_2.html' class="page-en">下一页</a><a href='list_6_81.html' class="page-en">末页</a></dd>'''
    #print content
    #print '###########################################'
    #content = '''<a href="list_6_81.html" class="page-en">末页</a>'''
    #xx = u'<a href=\'(.*?)\.html\' class="page-en">\xe6\x9c\xab\xe9\xa1\xb5</a>'  # 末页 中文
    #xx = u'<a href=(.*?) class="page-en">\xe6\x9c\xab\xe9\xa1\xb5</a>'  # 末页 中文
    xx = u'\xe4\xb8\x8b\xe4\xb8\x80\xe9\xa1\xb5</a><a href=\'list(.*?).html.*\xe6\x9c\xab\xe9\xa1\xb5</a>'  #下一页\xe4\xb8\x8b\xe4\xb8\x80\xe9\xa1\xb5 末页 \xe6\x9c\xab\xe9\xa1\xb5中文
    pattern = re.compile(xx,re.S)
    res = pattern.findall(content)
    #print res
    totalCount = int(res[0].split('_')[-1])
    print totalCount
    aa = (res[0].split('_')[1])
    print aa
    #return totalCount
    mmpage = []
    mmpage.append(url)  #第一页面,不符合规则
    for i in range(2,totalCount):
        mmurl = url + 'list_'+ str(res[0].split('_')[1]) + '_' +str(i) +'.html'
        mmpage.append(mmurl)
    return mmpage


def getMMHomePage(myurl): #对于每一页,获取当前页面存放的mm的homepage的url,存放到list列表当中
    url = myurl
    #url = 'http://www.mm131.com/mingxing/'  #这个NAV模块的第一页
    response = urllib2.urlopen(url)
    content = response.read().decode('gbk').encode('utf8')
    xx = u'<dd>.*?<a target="_blank" href="(.*?)"><img src=.*?alt="(.*?)".*?</a>'
    pattern = re.compile(xx,re.S)
    res = pattern.findall(content)
    return res   # res列表保存了每个MM的主页列表  列表 + 主页名字


def getMMImages(pageurl,dirname): #对于每个mm的homepage,打开homepage,并获取每个mm的totalPageCount,->推导出mmcontent_url,然后打开url获取图片并保存
    #url = 'http://www.mm131.com/mingxing/2016.html'
    url = pageurl
    response = urllib2.urlopen(url)
    content = response.read().decode('gbk').encode('utf8')
    xx = u'\xe5\x85\xb1(.*?)\xe9\xa1\xb5'
    pattern = re.compile(xx,re.S)
    res = pattern.findall(content)
    #print res
    pageCount = int(res[0])
    print pageCount
    url_ahead = url[:-5]  #截取从头当倒数第五位的字符串
    print url_ahead

    dirname = dirname.encode('gbk')
    path = 'D:\\mm\\'
    os.chdir(path)
    os.mkdir(dirname)

    for i in range(1,pageCount):
        #http://www.mm131.com/mingxing/2016.html  http://www.mm131.com/mingxing/2016_2.html http://www.mm131.com/mingxing/2016_3.html
        if i == 1:
            suburl = url
            saveImages(suburl,path+dirname)
        else:
            suburl = url_ahead + '_' + str(i) +'.html'
            saveImages(suburl,path+dirname)

#给定url,根据url,下载当前页面的img到指定目录
def saveImages(suburl,dirname):
    #url = 'http://www.mm131.com/mingxing/2016.html'
    url = suburl
    response = urllib2.urlopen(url)
    content = response.read().decode('gbk').encode('utf8')
    #print content
    xx = u'<div class="content-pic">.*?src="(.*?)"'
    pattern = re.compile(xx,re.S)
    res = pattern.findall(content)
    filename = res[0].split('/')[-1].split('.')[0] +'.jpg'
    #print 'filename',filename
    print '正在保存 %s,%s'%(dirname.decode('gbk').encode('utf8'),filename)
    #print dirname.decode('gbk').encode('utf8'),filename
    urllib.urlretrieve(res[0], dirname+'\\%s'%filename)



#####################################
mxlist = getNavTotalURL()
#print mxlist
print len(mxlist),"############"
#print getMMHomePage(mxlist[1])


for i in range(0,len(mxlist)):
    mmhomepage = []
    #print getMMHomePage(mxlist[0])
    mmhomepage.append(getMMHomePage(mxlist[i]))
    homelist = mmhomepage[0]  # 0  -->i
    for k in range(0,len(homelist)): #k是页数
        print homelist[k][0],homelist[k][1]
        getMMImages(homelist[k][0],homelist[k][1])

猜你喜欢

转载自blog.csdn.net/Martin201609/article/details/53260085