首先这个代码不是俺这个小白写的。但是毕竟学过几天python ,所以大部分还是能看懂。

爬下来5W多张美女图片啊,把我给激动的。

源代码拿过来的时候,因为是多线程,导致一爬,就把我的IP给封了,可能是访问速度太快,网站启动了保护机制。

后面自己加了几个sleep,这个问题就迎刃而解了。

哈哈。

直接上代码,给各位屌丝一饱口福吧!

# _*_coding:utf-8_*_# author:david.zimport requestsimport osfrom lxml import etreefrom threading import *from time import sleepimport time

nMaxThread = 3  # 这里设置需要开启几条线程ThreadLock = BoundedSemaphore(nMaxThread)print ("kaishi")
gHeads = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
}class Meizitu(Thread):# 构造函数def __init__(self, url, title):
        Thread.__init__(self)  # 调用父类构造函数self.url = url  # 这里的url在后面的referer中需要使用self.title = title# 线程开始函数def run(self):try:
            PhotoUrl, Page = self.GetPhotoUrlAndPageNum()if PhotoUrl and Page > 0:
                self.SavePhoto(PhotoUrl, Page)finally:  # 当线程执行完成之后释放 说明这个线程已经结束了 不管是异常结束还是正常结束 他都是结束了 那么就需要启动下一个新的线程来执行 新的内容了            ThreadLock.release()def GetPhotoUrlAndPageNum(self):
        html = requests.get(self.url, headers=gHeads)# requests.adapters.DEFAULT_RETRIES=5if html.status_code == 200:
            time.sleep(3)
            xmlContent = etree.HTML(html.text)
            PhotoUrl = xmlContent.xpath("//div[@class='main-image']/p/a/img/@src")[0][
                       :-6]  # 01.jpg  正好是-6   比如16a01.jpg  这个时候 从右边数到-6正好就是01.jpgPageNum = xmlContent.xpath("//div[@class='pagenavi']/a[5]/span/text()")[0]return PhotoUrl, int(PageNum)else:return None, None# 保存图片 如果文件夹不存在则创建文件夹def SavePhoto(self, url, page):
        savePath = "./photo3/%s" % self.titleif not os.path.exists(savePath):
            os.makedirs(savePath)for i in range(page):
            heads = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36","Referer": "%s/%d" % (self.url, i + 1),"Accept": "image/webp,image/apng,image/*,*/*;q=0.8"}
            j = 0while j < 5:print("kaishi3")
                time.sleep(4)print (u"Download : %s/%d.jpg" % (self.title, i + 1))
                time.sleep(6)
                html = requests.get("%s%02d.jpg" % (url, i + 1), headers=heads)if html.status_code == 200:
                    with open(savePath + "/%d.jpg" % (i + 1), "wb") as f:
                        f.write(html.content)breakelif html.status_code == 404:
                    j += 1time.sleep(4)continueelse:return Nonedef main():while True:try:
            nNum = int(raw_input(u"请输入要下载几页: "))  # 这里是python2的用法 python3可能已经没有raw_input了  建议换成inputif nNum > 0:breakexcept ValueError:print(u"请输入数字。")continuefor i in range(nNum):
        url = "https://www.mzitu.com/japan/page/%d/" % (i + 1)
        html = requests.get(url, headers=gHeads)print("kaishi2")
        time.sleep(4)if html.status_code == 200:
            xmlContent = etree.HTML(html.content)
            hrefList = xmlContent.xpath("//ul[@id='pins']/li/a/@href")
            titleList = xmlContent.xpath("//ul[@id='pins']/li/a/img/@alt")for i in range(len(hrefList)):
                ThreadLock.acquire()  # 这里使用信号量的原因是 比如当前的设置是3 是为了控制线程数 如果这里没有这个信号量 那么线程会无限启动t = Meizitu(hrefList[i], titleList[i])
                t.start()
                time.sleep(6)print ("--->:kaishi4")if __name__ == '__main__':
    main()