上一章讲了如何通过使用pyhthon的方法实现代理访问,这一章讲进行实战,比一个网站的图片自动化下载下来
目标网站:自己寻找任何一个图片网站,下面直讲解方法
1.分析网站元素,通过浏览器的审查元素查看
- 首先每张图片都有一个指向这组图的链接,要获取这个链接添加都一个列表里,然后在一个个遍历去下载对应链接里的图片,这里用get_page_num_1(url)来处理
- 进到每组图里,不会一页显示完所有的图片,此时用一个列表把这组图对应的所有链接存到一个列表里,用get_page_num_2(url)进行处理
- 如下图首页里有50页,使用detect_page_num(url)来查看有多少页,然后一页一页的遍历,在重复1.2步即可
- 未使用然和正则表达式,都是打开网页后用find方法寻找关键字
import urllib.request
import os
import random
ipList=['114.244.14.38:8060']
#,'27.208.94.59:8060','221.193.177.45:8060',
def url_open(url):
#proxy_support = urllib.request.ProxyHandler({'http':random.choice(ipList)})
#使用choice函数随机选择其中一个IP,这将会返回一个handler给proxy_support
#opener = urllib.request.build_opener(proxy_support)
#创建 opener
#opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36')]
#设置user-agent
#urllib.request.install_opener(opener)
#因为使用了urlopen访问所以要安装该opener
req=urllib.request.Request(url)
response=urllib.request.urlopen(req)
html=response.read()
return html
def get_page_num_1(url): #找到http:xx'各个套图的链接,写在列表里
html=url_open(url).decode('gbk')
page_addrs=[]
a=html.find('_blank')+14
while a!=-1:
b=html.find('.html',a,a+100)
if b != -1:
page_addrs.append(html[a+14:b])
else:
b=a+14
a=html.find('_blank',b)
print(page_addrs)
return page_addrs
def get_page_num_2(url): #找到各套路链接以后,翻页
page_addrs_2=[]
temp=[]
temp=get_page_num_1(url)
for each in temp:
new_page='http:xx'+each+".html"
print("当前下载网页为")
print(new_page)
html=url_open(new_page).decode("GBK")
a=html.find("本组图片")+13
b=html.find("</strong>",a)
num=int(html[a:b])
for each1 in range(1,num+1):
if each1==1:
page_addrs_2.append('http:xx'+each+'.html')
print('列表内容')
print(page_addrs_2)
else:
page_addrs_2.append('http:xx'+each+'_'+str(each1)+'.html')
print('列表内容')
print(page_addrs_2)
return page_addrs_2
def find_img(url_page,count):#在网页中下载图片
html=url_open(url_page).decode('GBK')
print(url_page)
img_addrs=[]
a=html.find("img src=")
C=html.find("class=\"left\">")+13
D=html.find("</span>",C)
count=html[C:D]
print(count)
while a != -1:
b=html.find(".jpg",a,a+255)
if b != -1:
if html[a+9:b+4]=='../../Image2/logo.jpg':
print("不下载图标")
else:
img_addrs.append(html[a+9:b+4])
print(html[a+9:b+4])
save_img('ooxx',html[a+9:b+4],count)
else:
b=a+9
a=html.find('img src=',b)
return img_addrs
def download(folder='ooxx'): #通过列表里的链接一个个去下载图片
if os.path.exists('C:\\Users\\威\\Desktop\\ooxx')==True:
os.chdir(folder)
else:
os.mkdir(folder)
os.chdir(folder)
page_addrs={}
count=0
url='http:XXXX
page_num=detect_page_num(url)#侦查有多少页
for count in range(1,page_num+1):
print("正在下载第一页")
if count==1:
page_addrs=get_page_num_2(url)
else:
url=url+str(count)+'.html'
page_addrs=get_page_num_2(url)
for each in page_addrs:
count+=1
img_addrs=find_img(each,count)
#save_img(folder,img_addrs)
def save_img(folder,img_addrs,count):
#for each in img_addrs:
filename=img_addrs.split('/')[-1]
print(count+filename)
with open(count+filename,'wb') as f: #先创建名字,在用urlopen打开图片
#有with会自动调用close
img=url_open(img_addrs)
f.write(img)
def detect_page_num(url):#侦查当前网页有多少页
html=url_open(url).decode('GBK')
a=html.find('当前')+7
b=html.find('页',a)+1
print('当前分类共有%s页'%html[a:b-2])
return int(html[a:b-2])
if __name__=='__main__':
download()
有不明白的地方,或者想交流的朋友,欢迎添加QQ:498721954