# encoding: utf-8 #加载bs4、re正则、random随机数、pymssql数据库 from bs4 import BeautifulSoup import re import random import pymssql import urllib2 import os import re import requests import time ''' 写这个程序的思路: 1:首先获取首页妹子的详情页的连接 1.1:因为是多个妹子,所以要用到list存储 2:获取妹子详情页里面的图片连接 2.1:妹子也很多的,但是每个妹子的图片连接规则都是一样的,所以要用while循环下 3:获取了妹子图片连接,穿给下载的函数 4:搞一个下载函数进行图片下载并且保存 ''' #定制一个headers相应头 # 定制响应头 Headers = { 'Accept-Encoding': r'gzip, deflate', 'Accept-Language': r'zh-CN,zh;q=0.8', 'Cache-Control': r'max-age=0', 'DNT': r'1', 'Referer': '', 'Upgrade-Insecure-Requests': r'1', 'Proxy-Connection': r'keep-alive', 'Host': r'i.meizitu.net', 'User-Agent': r'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36 OPR/47.0.2631.39' } #保存图片的方法,接受三个产品,url:妹子的图片地址 2:图片的名字 3:headers头 def get_img(url,filename,headers): #join用处很广泛,拼接路径 imgpath = os.path.join(path,filename) #print imgpath print os.path.dirname(imgpath) #print imgpath #判断imgpath文件路径是否存在 # 如果exists为trun和getsiz也为turn说明文件是存在的,那么就直接返回,exists是检查文件路径是否存在,getsize是检查文件大小 if os.path.exists(imgpath) and os.path.getsize(imgpath) > 10000: a = '文件已经存在,不用重新下载' return a else: # 判断是否存在文件夹 if not os.path.exists(os.path.dirname(imgpath)): # 如果不存在,那么就创建文件夹 os.makedirs(os.path.dirname(imgpath)) while True: try: # 获取图片的二进制 image = requests.get(url,headers=headers).content #with好处是自带了close功能,不用每次还得记得去关闭 with open(imgpath,'wb') as jpg: #写入获取到的二进制到图片 jpg.write(image) except requests.Timeout: #如果超时了,2秒之后再次去搞这事 time.sleep(2) continue #如果文件存在,返回break if os.path.getsize(imgpath) > 10000: break else: #如果文件不存在,那么3秒之后再次执行 time.sleep(3) #获取妹子们的套图 def get_img_url(url): while True: try: img_url = requests.get(url) except Exception:#捕获异常抛出 time.sleep(2) text = BeautifulSoup(img_url.text,'html.parser') #把所有的href跑出来 href = text.find( 'a',href = re.compile("http://www.mzitu.com/[0-9]+")) #print href #print href['href'] try: #获取妹子套图的url地址 result = href.find('img').attrs['src'] #print result break #print result except AttributeError: pass #存储图片 try: #print url #url = 'http://www.mzitu.com/99666/2' #对url进行分割,好进行设置路径 name = url.split('/') #print name #join进行拼接 file_name = os.path.join(name[3], name[4] + '.jpg') print file_name #print file_name except IndexError: file_name = os.path.join(name[3] + '.jpg') print file_name finally: #这点注意,这个首先是把headers里面的referer进行改变,因为做了反爬虫策略 Headers['Referer'] = url #保存图片,把url、名字、headers穿如到get_img函数 get_img(result,file_name,Headers) #p判断是否是最后一张 #re.match 函数,是检查两个url是否相等,如果相等,就把相似的返回出来,这里可以明显的看出来,如果有下一页,那么就会把下一页的地址返回出来,完成了下一页的功能 if re.match("http://www.mzitu.com/[0-9]+/[0-9]+", href['href']): #递归循环,如果发现还有下一页,那么再调用自己的函数 get_img_url(href.attrs['href']) else: #如果最后一页了,就返回1 print ('\n') return 1 #从首页开始去妹子的详情页的url def get_index(url): index_url = requests.get(url) text = BeautifulSoup(index_url.text,'html.parser') #正则表达式,符合条件的标签 meizi_url = text.find_all(href=re.compile('http://www.mzitu.com/[0-9]+')) #去出href的连接并存到一个list里面 meizi_list = [a['href'] for a in meizi_url] #返回这个list print meizi_list #初始化基础数据 url = 'http://www.mzitu.com' #os.path的join方法,是把路径进行拼接,getcwd是获取当前路径,然后这句话返回的是你的路径+meizu path = os.path.join(os.getcwd(),'meizu') # for i in get_index(url): # print ('======================================') # get_img_url(i) #为了测试逻辑搞一个测试的 get_img_url('http://www.mzitu.com/99666')
注释写的很明白,代码也很好理解,如果某一个方法不明白,google下这个函数的用法,就明白了。对了,函数就是方法,方法就是函数
下步任务:1:增加多线程功能 2:使用面相对象开发方式来做