python爬取美女图片
1、系统环境信息
Windows10 64bit
Python 2.7.12
爬取网址:www.mm131.com
2、具体步骤
- 查看网页具体信息,分析源代码
导航栏,主要分四个模块
查看源代码:
<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])