├── README.md └── 多线程爬虫下载斗图图片.py /README.md: -------------------------------------------------------------------------------- 1 | # Python_doutu 2 | by-黑小马 3 | -------------------------------------------------------------------------------- /多线程爬虫下载斗图图片.py: -------------------------------------------------------------------------------- 1 | # encoding=utf8 2 | #目的,获取http://www.doutula.com得图片到本地 3 | #本程序的爬虫会用多线程爬取,可以学习或者借鉴。 4 | #by 黑小马 5 | 6 | #http://www.doutula.com/photo/list/?page=2 7 | import urllib.request 8 | import re 9 | import os 10 | import threading 11 | import time 12 | 13 | #请求的UA 14 | UA = 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0' 15 | #存放图片地址的列表 16 | img_url_list=[] 17 | #存放页面地址 18 | page_url_list=[] 19 | #创建锁 20 | glock=threading.Lock() 21 | def init_page_url(): 22 | mkdir('photo') 23 | url = "http://www.doutula.com/photo/list/?page=" 24 | for x in range(1336): 25 | page_url_list.append(url+str(x)) 26 | 27 | 28 | def mkdir(path): 29 | # 引入模块 30 | # 去除首位空格 31 | path = path.strip() 32 | # 去除尾部 \ 符号 33 | path = path.rstrip("\\") 34 | # 判断路径是否存在 35 | # 存在 True 36 | # 不存在 False 37 | isExists = os.path.exists(path) 38 | # 判断结果 39 | if not isExists: 40 | # 如果不存在则创建目录 41 | # 创建目录操作函数 42 | os.makedirs(path) 43 | print(path + ' 创建成功') 44 | return True 45 | else: 46 | # 如果目录存在则不创建,并提示目录已存在 47 | # print (path+' 目录已存在') 48 | return False 49 | 50 | 51 | def get_img_url(): 52 | while True: 53 | # 开启锁 54 | glock.acquire() 55 | page_url=page_url_list.pop() 56 | # 释放锁 57 | glock.release() 58 | #不要请求太快,这个网站容易崩了,加一个延时 59 | time.sleep(1) 60 | req = urllib.request.Request(page_url, headers={'User-Agent': UA}) 61 | res = urllib.request.urlopen(req).read() 62 | data = res.decode('utf-8') 63 | reg = re.compile('data-original=".*?"') 64 | match = reg.findall(data) 65 | for colour in match: 66 | img_url_list.append(colour[15:-1]) 67 | if len(page_url_list)==0: 68 | print("没有页面地址了") 69 | break 70 | 71 | 72 | def download_img(name): 73 | while True: 74 | if len(img_url_list)==0: 75 | print("没有下载地址了") 76 | continue 77 | else: 78 | # 开启锁 79 | glock.acquire 80 | img_url=img_url_list.pop() 81 | # 释放锁 82 | glock.release 83 | file_name =img_url .split('/').pop() 84 | filename = os.path.join('photo',file_name) 85 | req = urllib.request.Request(img_url, headers={'User-Agent': UA}) 86 | res = urllib.request.urlopen(req) 87 | with open(filename, 'wb') as f: 88 | f.write(res.read()) 89 | print('线程:'+str(name)+'---下载完成: '+file_name) 90 | 91 | if __name__=='__main__': 92 | #初始化爬取页面 93 | init_page_url() 94 | #开3个线程获取图片地址 95 | for x in range(3): 96 | th=threading.Thread(target=get_img_url) 97 | th.start() 98 | #开3个线程下载图片 99 | for x in range(3): 100 | th=threading.Thread(target=download_img,args=[x]) 101 | th.start() 102 | --------------------------------------------------------------------------------