分享一份四百行的Python程式碼給你!可直接執行哦!企業級專案爬蟲
阿新 • • 發佈:2018-11-11
__author__ ="PSM" '''用於記錄暫時的錯誤,以便檢視''' import http.client import urllib.request import re import os import linecache print(" *************************************************************************") print(" 請輸入任何即可開始開始") print(" 可根據提示找到下載位置") print(" recode.txt為系統記錄檔案,切勿手動刪除,如果檔案太大,您可以刪除掉除了最後一行的所有內容") print(" recode.txt刪除後,程式會從頭開始") print(" *************************************************************************") input(" 請輸入任意內容:") siteUrl = 'http://www.mmonly.cc' #網頁主地址 siteUrl1 = 'http://t1.mmonly.cc' siteUrl_tag = 'http://www.mmonly.cc/tag' #標籤頁的地址 Url1_404 = siteUrl1.replace("http://","")#檢測404用的測試網站 patNumN = "n=(d*)" patNumM = 'm=(d*)' patNumE = 'e=(d*)' patNumR = 'r=(d*)' patNumQ = 'q=(d*)' patNumW = 'w=(d*)' patNumT = 't=(d*)' patTagTarget = '<a target="_blank" href="(.*?)" title="(.*?)">(.*?)</a>'#獲取標籤地址字尾和名稱 patTheme = '<div class="title"><span><a target="_blank" href="(.*?)">(.*?)</a>'#每個標籤內的每個主題地址和名稱 patTpage = "<li><a href='(.*?)' target='_self'>末頁</a></li>"#主題頁末頁的字尾,用來獲取主題最後一頁的數字 patTpageNum = "/tag/(.*?)/(d*).html' target='_self'>"#獲取主題數的頁數 patImg = "href='(.*?)'>檢視原圖</a></li>"#獲取主題內圖片地址用於下載 patImgPage ='<li><a>(.*?)</a></li>'#獲取主題圖片的總頁數,用於翻頁 tagUrl_data = urllib.request.urlopen(siteUrl_tag).read().decode('gbk') #讀取標籤頁的原始碼 tagUrl_data_target_result = re.compile(patTagTarget).findall(tagUrl_data)#爬出來標籤名稱和地址字尾 pathFir = "F:ImgSpider" pathFirIsExists = os.path.exists(pathFir) if not pathFirIsExists: os.mkdir(pathFir) else: pass file_recode1 = open(r"F:ImgSpider ecode.txt","a",encoding="utf-8") file_recode1.close() print("已創建出recode.txt資料夾,用於記錄和讀取") print("請勿手動刪除") file_recode2 = open(r"F:ImgSpider ecode.txt","rU",encoding="utf-8")#寫入用於記錄斷點位置的txt檔案 file_recode_result = file_recode2.readlines() #將檔案中的數值分為一行一行的讀取 file_recode2.seek(0) file_recode2.close() file_recode_count = len(file_recode_result) #讀取記錄檔案中的行數,用於後面的判定 # print(file_recode.readlines(file_recode_count)) if file_recode_count == 0: n = 0 # 表示標籤列表的迴圈 m = 1 # 表示標籤的迴圈 q = 0 # 表示主題頁中頁數的迴圈 w = 2 # 表示主題頁第一頁的迴圈 e = 2 # 表示圖片頁中的頁數的迴圈 r = 2 # 表示後幾頁主題的圖片頁數的迴圈 t = 0 else: recodeData = linecache.getline(r"F:ImgSpider ecode.txt",file_recode_count) # print(recodeData) n = re.compile(patNumN).findall(recodeData) # print(n1) m = re.compile(patNumM).findall(recodeData) # print(m1) q = re.compile(patNumQ).findall(recodeData) w = re.compile(patNumW).findall(recodeData) e = re.compile(patNumE).findall(recodeData) r = re.compile(patNumR).findall(recodeData) t = re.compile(patNumT).findall(recodeData) if bool(n) is True and bool(m) is True and bool(e) is True and bool(r) is True: n = n[0] m = m[0] e = e[0] r = r[0] q = [] w = 2 t = 0 elif bool(n) is True and bool(w) is True and bool(q) is True: n = n[0] q = q[0] w = w[0] m = 1 e = 2 r = 2 t = 0 elif bool(n) is True and bool(t) is True and bool(w) is True: n = n[0] t = t[0] w = w[0] m = 1 e = 2 r = 2 q = 0 n = int(n)#標籤的切換,第一個迴圈 n =0 # print(w1) while n< len(tagUrl_data_target_result): tagName = tagUrl_data_target_result[n][1]#標籤的名稱 tagUrlPart = tagUrl_data_target_result[n][0]#標籤網址的字尾 pathTag = "F:\ImgSpider\%s"%tagName#標籤路徑 pathTagIsExists = os.path.exists(pathTag) if not pathTagIsExists:#建立標籤資料夾在本地 print("檢測到您的資料夾內沒有[{}]這個資料夾,已幫您成功建立!!".format(str(tagName))) os.mkdir(pathTag) else: print("檢測到[{}]這個資料夾已經建立!已自動進入這個資料夾".format(str(tagName))) tagUrl = siteUrl + tagUrlPart#每個標籤的網址,又是第一頁主題頁的網址 tagUrlData = urllib.request.urlopen(tagUrl).read().decode("gbk")#每個標籤的原始碼,或者第一頁主題頁的原始碼 themeRe_num = re.compile(patTpageNum).findall(tagUrlData)#主題頁數,用於判定主題頁是否是1 m = int(m) # print(m) if m <len(themeRe_num):#判定主題頁數是否為1,不是就會呼叫翻頁程式m =1 themePage = themeRe_num[0] # 主題的頁數 themeRe = re.compile(patTheme).findall(tagUrlData) # 第一頁主題的地址加名稱 if bool(q) is True: '''有多個主題頁時,第一個主題頁裡面每個主題圖片的下載''' while int(q) < len(themeRe):#迴圈第一頁主題q = 0 '''先把第一頁的內容給搞定了''' themeName = themeRe[int(q)][1].replace("<b>","").replace("</b>","")#主題名稱 themeUrl = themeRe[int(q)][0]#主題內地址,也是圖片頁第一頁地址 themePath = "F:\ImgSpider\{}\{}".format(str(tagName),str(themeName))#設定主題名路徑 themePathIE = os.path.exists(themePath) if not themePathIE: print("檢測到您電腦上沒有[{}]資料夾,已自動幫您建立!!".format(str(themeName))) print("當前路徑為[{}]".format(str(themePath))) os.mkdir(themePath) else: print("檢測到[{}]已經建立!".format(str(themeName))) print("當前路徑為[{}]".format(str(themePath))) themeUrlData = urllib.request.urlopen(themeUrl).read().decode("gbk")#主題內的原始碼可以獲取第一頁圖片地址和圖片頁數 inThemeRe = re.compile(patImg).findall(themeUrlData)#第一頁圖片的下載地址 inThemePageRe = re.compile(patImgPage).findall(themeUrlData)#獲取了圖片的頁數,用於圖片翻頁。未處理 print("已探測到有可下載圖片,已開始全速前進開始下載") if bool(inThemeRe) is True: Url_404 = inThemeRe[0].replace(siteUrl,"") Is4041 = http.client.HTTPConnection(Url1_404) Is4041.request("GET", Url_404, '', {}) Is404 = Is4041.getresponse().status if Is404 != 404: imgPathFir = themePath +"\1.jpg" for imgFir in inThemeRe: imgFirDown = urllib.request.urlretrieve(imgFir,imgPathFir) print("[{}]標籤的第[1]頁的[{}]主題的第[1]張圖片已下載成功".format(str(tagName),str(themeName))) else: print("[{}]標籤的第[1]頁的[{}]主題的第[1]張圖片未找到下載地址".format(str(tagName),str(themeName))) inThemePage = inThemePageRe[0].replace("共","").replace("頁: ","")#圖片的頁數,已處理 print("[{}]主題已發現了[{}]張圖片,加快馬達,全速下載!!".format(str(themeName),int(inThemePage))) '''第一頁主題頁圖片翻頁''' while w <= int(inThemePage):#w =2 '''寫入迴圈數值用於記錄''' file_recode3 = open(r"F:ImgSpider ecode.txt", "a", encoding="utf-8") file_recode3.write("n=%s"%n) file_recode3.close() file_recode4 = open(r"F:ImgSpider ecode.txt", "a", encoding="utf-8") file_recode4.write("q=%s"%q) file_recode4.close() file_recode5 = open(r"F:ImgSpider ecode.txt", "a", encoding="utf-8") file_recode5.write("w=%s"%w) file_recode5.close() file_recode6 = open(r"F:ImgSpider ecode.txt", "a", encoding="utf-8") file_recode6.write(" ") file_recode6.close() imgUrlN = themeUrl.replace(".html","_%s.html"%w)#圖片後面頁數的地址,用於獲取原始碼,下載圖片 imgUrlNData = urllib.request.urlopen(imgUrlN).read().decode('gbk')#圖片頁後面頁的原始碼 imgNext = re.compile(patImg).findall(imgUrlNData)#後面頁數的下載地址 Url2_404 = imgUrlN.replace(siteUrl, "") # Url11_404 = siteUrl.replace("http://", "") Is4041 = http.client.HTTPConnection(Url1_404) Is4041.request("GET", Url2_404, '', {}) Is404 = Is4041.getresponse().status if Is404 != 404: for imgNex in imgNext:#下載後頁數的圖片 imgPathNex = themePath + "\%s.jpg"%w imgNextDown = urllib.request.urlretrieve(imgNex,imgPathNex) print("[{}]標籤的第[1]頁的[{}]主題的第[{}]張圖片已下載成功!!".format(str(tagName),str(themeName),w)) else: print("[{}]標籤的第[1]頁的[{}]主題的第[{}]張圖片未找到地址!".format(str(tagName),str(themeName),w)) w =int(w) + 1 if w > int(inThemePage): w = 2 else: w = int(w) else: print("[{}]主題的第[1]頁未發現可下載內容,已自動進入下一主題".format(str(themeName))) q =int(q) +1 if int(q) > len(themeRe) : q = 0 else: q = int(q) else: '''上面第一頁搞定了,現在來搞定第n頁的圖片抓取''' while int(m) < len(themePage):#迴圈主題頁數 m = 1與上面m相同,上面用於判定,這裡用於迴圈。 #先獲取後面頁數的主題的地址,好用於獲取原始碼 themeNextUrl = tagUrl + "/%s.html"%int(m+1)#從第二頁主題頁開始 # print(themeNextUrl) themeNextData = urllib.request.urlopen(themeNextUrl).read().decode("gbk")#第二頁主題開始的原始碼 themeNextRe = re.compile(patTheme).findall(themeNextData)#第二頁開始的主題地址和名稱 while int(e)< len(themeNextRe):#迴圈主題數e = 0 themeNextName = themeNextRe[int(e)][1].replace("<b>","").replace("</b>","")#第二頁開始的主題名 inThemeNextUrl = themeNextRe[int(e)][0]#第二頁開始的主題連結地址也是第一頁圖片地址 themePathNext = "F:\ImgSpider\{}\{}".format(str(tagName),str(themeNextName))#第二頁開始的主題本地路徑 themePathNextIE = os.path.exists(themePathNext) if not themePathNextIE: print("檢測到您電腦上沒有[{}]資料夾,已自動幫您建立!!".format(str(themeNextName))) print("當前路徑為[{}]".format(str(themePathNext))) os.mkdir(themePathNext) else: print("檢測到[{}]已經建立!".format(str(themeNextName))) print("當前路徑為[{}]".format(str(themePathNext))) inThemeNeData = urllib.request.urlopen(inThemeNextUrl).read().decode("gbk")#第一頁圖片內的原始碼 thNextImgRe = re.compile(patImg).findall(inThemeNeData)#第一頁圖片地址 thNextimgPageRe =re.compile(patImgPage) .findall(inThemeNeData)#後面頁的頁數,未處理 print("已探測到有可下載圖片,已開始全速前進開始下載") if bool(thNextImgRe) is True: themeNextimgPathFir = themePathNext + "\1.jpg" Url4_404 = thNextImgRe[0].replace(siteUrl, "") # Url11_404 = siteUrl.replace("http://", "") Is4041 = http.client.HTTPConnection(Url1_404) Is4041.request("GET", Url4_404, '', {}) Is404 = Is4041.getresponse().status if Is404 != 404: for tNimgFir in thNextImgRe: tNimgFirDown = urllib.request.urlretrieve(tNimgFir,themeNextimgPathFir) print("[{}]標籤的第[{}]頁的[{}]主題的第[1]張圖片已下載成功".format(str(tagName),int(m+1),str(themeNextName))) else: print("[{}]標籤的第[{}]頁的[{}]主題的第[1]張圖片未找到下載地址!!".format(str(tagName), int(m + 1), str(themeNextName))) #上面第一張圖片完成 '''現在來搞定後n頁圖片的下載''' thNextimgPage = thNextimgPageRe[0].replace("共","").replace("頁: ","") print("[{}]主題已發現了[{}]張圖片,加快馬達,全速下載!!".format(str(themeNextName),int(thNextimgPage))) while int(r) <= int(thNextimgPage):#翻頁下載後面頁的圖片,r=2 file_recode7 = open(r"F:ImgSpider ecode.txt", "a", encoding="utf-8") file_recode7.write("n=%s"%n) file_recode7.close() file_recode8 = open(r"F:ImgSpider ecode.txt", "a", encoding="utf-8") file_recode8.write("m=%s"%m) file_recode8.close() file_recode9 = open(r"F:ImgSpider ecode.txt", "a", encoding="utf-8") file_recode9.write("e=%s"%e) file_recode9.close() file_recode_1 = open(r"F:ImgSpider ecode.txt", "a", encoding="utf-8") file_recode_1.write("r=%s"%r) file_recode_1.close() file_recode_2 = open(r"F:ImgSpider ecode.txt", "a", encoding="utf-8") file_recode_2.write(" ") file_recode_2.close() thNextimgN = inThemeNextUrl.replace(".html","_%s.html"%r) # print(thNextimgN) thNextimgNData = urllib.request.urlopen(thNextimgN).read().decode('gbk') thNextimgNRe = re.compile(patImg).findall(thNextimgNData)#後面頁數的下載地址 Url3_404 = thNextimgNRe[0].replace(siteUrl, "") # Url1_404 = siteUrl.replace("http://", "") Is4041 = http.client.HTTPConnection(Url1_404) Is4041.request("GET", Url3_404, '', {}) Is404 = Is4041.getresponse().status if Is404 != 404: for thNextimgNex in thNextimgNRe:#下載後面頁數的圖片 thNextimgPathNex = themePathNext + "\%s.jpg"%r thNextimgNDown = urllib.request.urlretrieve(thNextimgNex,thNextimgPathNex) print("[{}]標籤的第[{}]頁的[{}]主題的第[{}]張圖片已下載成功!!".format(str(tagName),int(m+1), str(themeNextName), r)) else: print("[{}]標籤的第[{}]頁的[{}]主題的第[{}]張圖片未找到下載地址!!".format(str(tagName),int(m+1), str(themeNextName), r)) r =int(r)+1 if r > int(thNextimgPage): r = 2 else: r = r else: print("[{}]主題的第[1]頁未發現可下載內容,已自動進入下一主題".format(str(themeNextName))) '''上面主題頁翻頁已經完成,下面是主題頁只有一頁的程式碼,複製貼上一下上面主題頁第一頁的改改就行了''' # print(r) e=int(e)+ 1 if int(e)>len(themeNextRe): e = 0 else: e = int(e) m=int(m)+1 if int(m)>len(themePage): m = 1 else: m = int(m) else: themeRe = re.compile(patTheme).findall(tagUrlData) # 主題的地址加名稱 while int(t) < len(themeRe):#迴圈第一頁主題t = 0 '''只有一頁的標籤的時候搞定程式碼''' themeName = themeRe[int(t)][1].replace("<b>","").replace("</b>","")#主題名稱 themeUrl = themeRe[int(t)][0]#主題內地址,也是圖片頁第一頁地址 # print(themeUrl) themePath = "F:\ImgSpider\{}\{}".format(str(tagName),str(themeName))#設定主題名路徑 themePathIE = os.path.exists(themePath) if not themePathIE: print("檢測到您電腦上沒有[{}]資料夾,已自動幫您建立!!".format(str(themeName))) print("當前路徑為[{}]".format(str(themePath))) os.mkdir(themePath) else: print("檢測到[{}]已經建立!".format(str(themeName))) print("當前路徑為[{}]".format(str(themePath))) themeUrlData = urllib.request.urlopen(themeUrl).read().decode("gbk")#主題內的原始碼可以獲取第一頁圖片地址和圖片頁數 inThemeRe = re.compile(patImg).findall(themeUrlData)#第一頁圖片的下載地址 inThemePageRe = re.compile(patImgPage).findall(themeUrlData)#獲取了圖片的頁數,用於圖片翻頁。未處理 # print(inThemeRe[0]) if bool(inThemeRe) is True: print("已探測到有可下載圖片,已開始全速前進下載") imgPathFir = themePath +"\1.jpg" Url5_404 = inThemeRe[0].replace(siteUrl, "") # Url1_404 = siteUrl.replace("http://", "") Is4041 = http.client.HTTPConnection(Url1_404) Is4041.request("GET", Url5_404, '', {}) Is404 = Is4041.getresponse().status if Is404 != 404: # print(Is404) for imgFir in inThemeRe: imgFirDown = urllib.request.urlretrieve(imgFir,imgPathFir) print("[{}]標籤的[{}]主題的第[1]張圖片已下載成功".format(str(tagName),str(themeName))) else: print("[{}]標籤的[{}]主題的第[1]張圖片已下載成功".format(str(tagName), str(themeName))) # print(inThemePageRe) inThemePage = inThemePageRe[0].replace("共","").replace("頁: ","")#圖片的頁數,已處理 # print(inThemePage) print("[{}]主題已發現了[{}]張圖片,加快馬達,全速下載!!".format(str(themeName),inThemePage)) '''圖片翻頁''' print("已開始下載剩餘頁數的圖片") while int(w) <= int(inThemePage):#w =2 file_recode_3 = open(r"F:ImgSpider ecode.txt","a",encoding="utf-8") file_recode_3.write("n=%s"%n) file_recode_3.close() file_recode_4 = open(r"F:ImgSpider ecode.txt", "a", encoding="utf-8") file_recode_4.write("t=%s"%t) file_recode_4.close() file_recode_5 = open(r"F:ImgSpider ecode.txt","a",encoding="utf-8") file_recode_5.write("w=%s"%w) file_recode_5.close() file_recode_6 = open(r"F:ImgSpider ecode.txt", "a", encoding="utf-8") file_recode_6.write(" ") file_recode_6.close() imgUrlN = themeUrl.replace(".html","_%s.html"%int(w))#圖片後面頁數的地址,用於獲取原始碼,下載圖片 # print(imgUrlN) imgUrlNData = urllib.request.urlopen(imgUrlN).read().decode('gbk')#圖片頁後面頁的原始碼 imgNext = re.compile(patImg).findall(imgUrlNData)#後面頁數的下載地址 Url6_404 = imgNext[0].replace(siteUrl, "") # Url1_404 = siteUrl.replace("http://", "") Is4041 = http.client.HTTPConnection(Url1_404) Is4041.request("GET", Url6_404, '', {}) Is404 =Is4041.getresponse().status if Is404 != 404: for imgNex in imgNext:#下載後頁數的圖片 imgPathNex = themePath + "\%s.jpg"%w imgNextDown = urllib.request.urlretrieve(imgNex,imgPathNex) print("[{}]標籤的[{}]主題的第[{}]張圖片已下載成功!!".format(str(tagName),str(themeName),w)) else: print("[{}]標籤的[{}]主題的第[{}]張圖片已下載成功!!".format(str(tagName), str(themeName), w)) w =int(w)+1 if int(w) >int(inThemePage): w =2 else: w =int(w) else: print("[{}]主題的第[1]頁未發現可下載內容,已自動進入下一主題".format(str(themeName))) t =int(t) +1 if int(t)>len(themeRe) : t = 0 else : t = int(t) n +=1 print("***************************") print(" 請輸入任何內容結束") print("***************************") input()
更多好玩的原始碼或者書籍請進群:548377875 即可獲取!