我又來送福利啦!!!不同於上篇文章,這次我們的爬蟲採用了多線程,一直以來被所謂的分散式 多線程 爬蟲 給唬的怕怕的。今天就來一發多線程爬蟲吧,還能看妹子圖,想想就覺得很激動!!! 依然是流程解釋: 1.分析要爬取的網址,發現頁面分兩級,第一級是多個圖片集的入口,第二集是圖片的入口。我們新建兩...
我又來送福利啦!!!不同於上篇文章,這次我們的爬蟲採用了多線程,一直以來被所謂的分散式 多線程 爬蟲 給唬的怕怕的。今天就來一發多線程爬蟲吧,還能看妹子圖,想想就覺得很激動!!!
依然是流程解釋:
1.分析要爬取的網址,發現頁面分兩級,第一級是多個圖片集的入口,第二集是圖片的入口。我們新建兩個類,一個類是爬取所有圖片集的url,一個類是根據得到的圖片集的url爬取圖片下載下來。第二個類的功能就跟我們上篇爬取煎蛋的功能一樣。
2.我們考慮用多線程去實現爬蟲,為此我們引入了Queue模塊,主線程爬取第一級得到多個圖片集url放入到queue中,新建多個線程,從queue中取出數據,然後下載圖片!
3.遇到的困難呢 萬惡的編碼坑,要註意規避可能出現的錯誤 因為出現問題 線程就會死掉。
這篇正則啥的就不搞了,其實都很簡單的,對於html分析python有一些庫是比較不錯的,比如Beautiful Soup 有機會再學習學習!還有爬蟲框架Scrapy。。。要學習的東西還非常非常多啊。務必腳踏實地!!!
1 # -*- coding: utf-8 -*- 2 from __future__ import unicode_literals 3 from HttpClient import HttpClient 4 import sys,re,os 5 from threading import Thread 6 from Queue import Queue 7 from time import sleep 8 9 q = Queue()#圖片集url隊列 10 imgCount = 0 11 class getRosiUrl(HttpClient):#一級url爬取類 12 def __init__(self): 13 self.__pageIndex = 1 14 self.__Url = "http://www.5442.com/tag/rosi/" 15 self.__refer = 'http://www.5442.com/tag/rosi.html' 16 #將爬取的圖片集url放入隊列 17 def __getAllPicUrl(self,pageIndex): 18 realurl = self.__Url + str(pageIndex) + ".html" 19 print realurl 20 pageCode = self.Get(realurl,self.__refer) 21 type = sys.getfilesystemencoding() 22 #print pageCode[0:1666].decode("gb2312",'ignore').encode(type) 23 pattern = re.compile('<div.*?title">.*?<span><a href="(.*?)".*?</a>',re.S) 24 items = re.findall(pattern,pageCode.decode("gb2312",'ignore').encode(type)) 25 for item in items: 26 #print item 27 global q 28 q.put(item) 29 #print "放入隊列" 30 #得到最新頁碼 31 def __getNewPage(self): 32 pageCode = self.Get("http://www.5442.com/tag/rosi.html",self.__refer) 33 type = sys.getfilesystemencoding() 34 pattern = re.compile(r'<ul.*?<li .*?pageinfo">(.*?)</li>',re.S) 35 newPage = re.search(pattern,pageCode.decode("gb2312",'ignore').encode(type)) 36 num = re.search("[0-9]+",newPage.group(1).decode("gb2312",'ignore').split("/")[0]).group() 37 if newPage != None: 38 return int(num) 39 return 0 40 41 def start(self): 42 page = self.__getNewPage() 43 for i in range(1,page): 44 self.__getAllPicUrl(i) 45 46 #圖片下載類 47 class downloadImg(HttpClient): 48 def __init__(self): 49 self.__pageIndex = 1 50 self.__floder = "rosi" 51 self.__Url = "http://www.5442.com/meinv/20150904/27058.html" 52 self.__refer = 'http://www.5442.com/tag/rosi.html' 53 def __getNewPage(self): 54 pageCode = self.Get(self.__Url,self.__refer) 55 type = sys.getfilesystemencoding() 56 pattern = re.compile(r'<ul.*?<li>.*?<a>(.*?)</a></li>',re.S) 57 newPage = re.search(pattern,pageCode.decode("gb2312",'ignore').encode(type)) 58 if newPage !=None: 59 num = re.search("[0-9]+",newPage.group(1).decode("gb2312",'ignore').split("/")[0]).group() 60 return int(num) 61 return 0 62 #得到圖片集名稱 63 def __getBookName(self): 64 pageCode = self.Get(self.__Url,self.__refer) 65 type = sys.getfilesystemencoding() 66 pattern = re.compile(r'<h1><a.*?>(.*?)</a>',re.S) 67 title = re.findall(pattern,pageCode.decode("gb2312",'ignore').encode(type)) 68 if title != None: 69 return title[0] 70 return "未命名" 71 #得到每頁圖片url 72 def __getAllPicUrl(self,pageIndex): 73 realurl = self.__Url[:-5] + "_" + str(pageIndex) + ".html" 74 pageCode = self.Get(realurl) 75 type = sys.getfilesystemencoding() 76 pattern = re.compile('<p align="center" id="contents">.*?<a.*?<img src=(.*?) alt=.*?>',re.S) 77 items = re.findall(pattern,pageCode.decode("gb2312",'ignore').encode(type)) 78 self.__savePics(items,self.__floder) 79 #下載保存圖片 80 def __savePics(self,img_addr,folder): 81 for item in img_addr: 82 filename = self.__floder + "\\" +item.split('/')[-1][:-1] 83 print "正在保存圖片:" + filename 84 print item[1:-1] 85 with open(filename,'wb') as file: 86 img = self.Get(item[1:-1]) 87 file.write(img) 88 global imgCount 89 imgCount = imgCount + 1 90 def start(self): 91 while True: 92 global q 93 self.__Url = q.get()#從隊列中取出一條圖片集url 94 title = self.__getBookName() 95 self.__floder = os.getcwd() + "\\rosi\\" + title.decode("gb2312",'ignore') 96 isExists=os.path.exists(self.__floder) 97 if not isExists: 98 type = sys.getfilesystemencoding() 99 os.mkdir(self.__floder) 100 101 page = self.__getNewPage() + 1 102 for i in range(self.__pageIndex,page): 103 self.__getAllPicUrl(i) 104 105 q.task_done()#完成一項任務 106 107 108 109 110 if __name__ == '__main__': 111 isExists=os.path.exists("rosi")#創建保存目錄 112 if not isExists: 113 os.mkdir("rosi") 114 for i in range(5):#新建5個線程 等待隊列 115 print i 116 downImg = downloadImg() 117 t = Thread(target=downImg.start) 118 t.setDaemon(True) 119 t.start() 120 rosi = getRosiUrl() 121 rosi.start() 122 123 q.join
其中HttpClient.py就參考前面文章的吧,不過這個網站不需要代理了。。。下麵看看成果吧,一波妹子圖正在襲來: