python爬蟲入門---第三篇:自動下載圖片
阿新 • • 發佈:2019-02-11
等待 部分 app class 請您 pictures string fin from
適用的圖片網站:美桌
import requests import re import urllib from bs4 import BeautifulSoup def get_html_text(url): ‘‘‘ 獲取網址url的HTML代碼,以字符串形式返回html代碼 ‘‘‘ try: res = requests.get(url, timeout = 6) res.raise_for_status() res.encoding = res.apparent_encoding returnres.text except: return ‘‘ print(‘請求異常‘) def get_grupic_url(page_url, grupic_url_list, unique_url): ‘‘‘ 獲取每張頁面中每個圖冊的url鏈接,每個圖冊的url都有共同 且有別於其他鏈接的url,我們把部分特征的字符串放在unique_url 中,通過它我們就可以篩選出頁面中所有圖冊的url ‘‘‘ page_html = get_html_text(page_url) #解析頁面的html代碼soup = BeautifulSoup(page_html, ‘html.parser‘) #獲取該頁面html代碼中的所有<a>標簽 a_tags = soup.find_all(‘a‘) #篩選出href屬性中含有特征字符串unique_url的<a>標簽 for a_tag in a_tags: url = a_tag.get(‘href‘) if re.match(unique_url, url): #將篩選出的<a>標簽的url加入到列表中 grupic_url_list.append(url)def get_allpages_url(cover_url, pages_url_list): ‘‘‘通過遞歸獲取所有頁面的鏈接, 直到該頁面不存在class = ‘next‘的<a>標簽 ‘‘‘ html = get_html_text(cover_url) soup = BeautifulSoup(html, ‘html.parser‘) #找到屬性class = ‘next‘的<a>標簽 a_tags = soup.find_all(‘a‘, class_ = ‘next‘) #如果<a>標簽存在,就將該標簽的url加入列表 if a_tags: nextpage_url = a_tags[0].get(‘href‘) pages_url_list.append(nextpage_url) #遞歸獲取下一個頁面的<a>標簽 get_allpages_url(nextpage_url, pages_url_list) #當不存在屬性class = ‘next‘的<a>標簽時,說明這是最後一頁,結束遞歸 return None def download_each_page(grupic_url_list, file_path1, page): ‘‘‘ 通過調用download_each_group()函數, 下載每一頁中的所有組圖 ‘‘‘ print(‘\n\n第 {0} 頁開始下載:\n‘.format(str(page))) gup = 1 #組數標記 #下載該頁面中每個小相冊的所有圖片 for grupic_url in grupic_url_list: file_path2 = file_path1 + ‘_{0}‘.format(str(gup)) #獲取該頁面的h1標題 h1_string = get_h1_string(grupic_url) try: download_each_group(grupic_url, file_path2, h1_string, gup) gup += 1 except: print("下載異常") gup += 1 continue def download_all_page(pages_url_list, file_path, unique_url): ‘‘‘通過調用函數download_each_page(), 來下載所有頁面的圖片 ‘‘‘ pages_num = len(pages_url_list) print(‘\n相冊一共有 {0} 頁,已經開始下載請您耐心等待...‘.format(str(pages_num))) page = 1 #頁數標記 for page_url in pages_url_list: grupic_url_list = [] get_grupic_url(page_url, grupic_url_list, unique_url) file_path1 = file_path + r‘\{0}‘.format(str(page)) download_each_page(grupic_url_list, file_path1, page) page += 1 def download_each_group(grupic_url, file_path, h1_string, gup, n = 1): ‘‘‘ 進入鏈接為grupic_url的圖冊,下載我們需要的大圖片, 並遞歸進入下一個頁面開始下載,直到圖冊的h1標題發生改變 ‘‘‘ new_file_path = file_path + ‘_{0}.jpg‘.format(str(n)) n += 1 html = get_html_text(grupic_url) soup = BeautifulSoup(html, ‘html.parser‘) #當該頁面的h1標題和小相冊封面的h1標題相同時開始下載 if h1_string == soup.h1.string: #找到屬性class_ = ‘pic-large‘的img標簽 img_tags = soup.find_all(‘img‘, class_ = ‘pic-large‘) img_tag = img_tags[0] #下載該img標簽屬性data-original提供的url鏈接,即為目標圖片的鏈接 urllib.request.urlretrieve(img_tag.get(‘data-original‘), new_file_path) #獲取下一個頁面的鏈接 next_url = img_tag.parent.get(‘href‘) print(‘第 {0} 組:{1}, 第 {2} 張下載完成啦‘.format(str(gup), h1_string, str(n-1))) #遞歸下載下一個頁面的目標圖片 download_each_group(next_url, file_path, h1_string, gup, n) #當h1標題不同時,說明進入到了另一個小相冊,結束遞歸 return None def get_h1_string(url): ‘‘‘ 獲取網址為url網站的h1標簽內容 ‘‘‘ try: html = get_html_text(url) soup = BeautifulSoup(html, ‘html.parser‘) return soup.h1.string except: print(‘h1標題獲取異常‘) return ‘‘ def main(): ‘‘‘ 主函數 ‘‘‘ #封面的url鏈接,也就是第一頁的url鏈接 cover_url = ‘http://www.win4000.com/mt/huge_1.html‘ #小相冊鏈接中有別於其他鏈接的特征字符串 unique_url = r‘http://www.win4000.com/meinv‘ #圖片存放的目錄 file_path = r‘G:\pictures\huge‘ #存放所有頁面鏈接的列表 pages_url_list = [] #先將封面,即第一頁加入列表 pages_url_list.append(cover_url) #獲取其他頁面的鏈接 get_allpages_url(cover_url, pages_url_list) #下載所有頁面中所有圖片的函數 download_all_page(pages_url_list, file_path, unique_url) main()
python爬蟲入門---第三篇:自動下載圖片