一、思路:
1、分析网站,获取网址图片的流程
初始网址http://www.meiwall.com/ugirls
index网址:http://www.meiwall.com/ugirls/260.html
带页码网址:http://www.meiwall.com/ugirls/260_3.html
2、具体步骤
a、get_data获取初始网址内容(初始网址http://www.meiwall.com/ugirls)
b、get_index获取index网址(index网址:http://www.meiwall.com/ugirls/260.html )
c、get_data获取index网址内容
c、get_maxpages获取最大页码,拼接出带页码的网址(带页码网址:http://www.meiwall.com/ugirls/260_3.html)
d、get_data获取带页码网址内容
e、get_imge获取图片并保存
二、代码:
import urllib.request
import re
import os
import string
from urllib.parse import quote
import gzip
#通过网址获取网址内容
def get_data(url):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36 LBBROWSER'}
url = quote(url, safe=string.printable)
get_html = urllib.request.Request(url=url, headers=headers)
get_data=urllib.request.urlopen(get_html).read()
# get_data=gzip.decompress(get_data).decode("utf-8")
return get_data.decode("utf-8")
def get_index(data):
re_index=r'<a href="(http://www.meiwall.com/ugirls/\d+?\.html)" target="_blank">'
re_index=re.compile(re_index)
index_urls=re.findall(re_index,data)
index_urls=list(index_urls)
print('二级网址:',index_urls)
return index_urls
#获取最大页码
def get_maxpage(data):
re_maxpage= r'<a class="page-numbers" href="http://www.meiwall.com/ugirls/\d+?\D(\d+?)\.html" title="最后页">'
re_maxpage=re.compile(re_maxpage)
maxpages=re.findall(re_maxpage,data)
maxpages=int(list(maxpages)[0])
print('最大页码:',maxpages)
return maxpages
def get_imge(second_data,i,y):
#< img src = "https://mtl.ttsqgs.com/css/logo.jpg"
#< img src = "https://pic4.zhimg.com/50/bf6142aa8853b15109982f4b722283f9_hd.jpg"
re_imge=r'<img src="(http://.+?\.jpg)"'
re_imge=re.compile(re_imge)
print(re_imge)
imge_urls=re.findall(re_imge,second_data)
imge_urls=list(imge_urls)
print('图像地址:',imge_urls)
path='D:/美窝网/'+str(y)+'//'
if not os.path.isdir(path):
os.makedirs(path)
paths=path+'//'
for imge_url in imge_urls:
urllib.request.urlretrieve(imge_url,'{}{}.jpg'.format(paths,str(i)))
return imge_url
#开始调用
#h通过主页获取一级网址
data=get_data('http://www.meiwall.com/ugirls')
index_urls=get_index(data)
print('二级网址汇总:',index_urls)
y=0
for index_url in index_urls:
second_data = get_data(index_url)
maxpages = get_maxpage(second_data)
print('最大页码:',maxpages)
for i in range(1,maxpages+1):
page_url=index_url.replace('.html',"_"+str(i)+'.html')
print('带页码的网址:',page_url)
page_data=get_data(page_url)
print(get_imge(page_data,i,y))
y=y+1
三、学习内容
1、正则表达式
可以通过先用完整的字符串最为正则表达式,然后逐个替换为 预定义字符集和数量词
如下:
观察我们要获取的网址,发现就是数字是变动的,可以用\d代表数字,+代表数量大于一次,?代表非贪婪,\.是因为要转义
re_index=r'<a href="(http://www.meiwall.com/ugirls/260.html)" target="_blank">'
re_index=r'<a href="(http://www.meiwall.com/ugirls/\d+?\.html)" target="_blank">'
2、for循环
要注意的是因为每页一个图片,所以要有一个循环增长的数字来作为图片名称
print(get_imge(page_data,i,y))
此处的入参i,是为了给获取图片名称的时候,进行增长的
urllib.request.urlretrieve(imge_url,'{}{}.jpg'.format(paths,str(i)))