目標網站:妹子圖網
環境:Python3.x
相關第三方模塊:requests、beautifulsoup4
Re:各位在測試時只需要將代碼里的變量 path 指定為你當前系統要保存的路徑,使用 python xxx.py 或IDE運
# -*- coding: utf-8 -*- import requests from bs4 import BeautifulSoup import os all_url = 'https://www.mzitu.com' # http請求頭 Hostreferer = { 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)', 'Referer': 'http://www.mzitu.com' } # 此請求頭Referer破解盜圖鏈接 Picreferer = { 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)', 'Referer': 'http://i.meizitu.net' } # 對mzitu主頁all_url發起請求,將返回的HTML數據保存,便於解析 start_html = requests.get(all_url, headers=Hostreferer) # Linux保存地址 # path = '/home/Nick/Desktop/mzitu/' # Windows保存地址 path = 'E:/mzitu/' # 獲取最大頁數 soup = BeautifulSoup(start_html.text, "html.parser") page = soup.find_all('a', class_='page-numbers') max_page = page[-2].text # same_url = 'http://www.mzitu.com/page/' # 主頁默認最新圖片 # 獲取每一類MM的網址 same_url = 'https://www.mzitu.com/mm/page/' # 也可以指定《qingchun MM系列》 for n in range(1, int(max_page) + 1): # 拼接當前類MM的所有url ul = same_url + str(n) # 分別對當前類每一頁第一層url發起請求 start_html = requests.get(ul, headers=Hostreferer) # 提取所有MM的標題 soup = BeautifulSoup(start_html.text, "html.parser") all_a = soup.find('div', class_='postlist').find_all('a', target='_blank') # 遍歷所有MM的標題 for a in all_a: # 提取標題文本,作為文件夾名稱 title = a.get_text() if(title != ''): print("准備扒取:" + title) # windows不能創建帶?的目錄,添加判斷邏輯 if(os.path.exists(path + title.strip().replace('?', ''))): # print('目錄已存在') flag = 1 else: os.makedirs(path + title.strip().replace('?', '')) flag = 0 # 切換到上一步創建的目錄 os.chdir(path + title.strip().replace('?', '')) # 提取第一層每一個MM的url,並發起請求 href = a['href'] html = requests.get(href, headers=Hostreferer) mess = BeautifulSoup(html.text, "html.parser") # 獲取第二層最大頁數 pic_max = mess.find_all('span') pic_max = pic_max[9].text if(flag == 1 and len(os.listdir(path + title.strip().replace('?', ''))) >= int(pic_max)): print('已經保存完畢,跳過') continue # 遍歷第二層每張圖片的url for num in range(1, int(pic_max) + 1): # 拼接每張圖片的url pic = href + '/' + str(num) # 發起請求 html = requests.get(pic, headers=Hostreferer) mess = BeautifulSoup(html.text, "html.parser") pic_url = mess.find('img', alt=title) print(pic_url['src']) html = requests.get(pic_url['src'], headers=Picreferer) # 提取圖片名字 file_name = pic_url['src'].split(r'/')[-1] # 保存圖片 f = open(file_name, 'wb') f.write(html.content) f.close() print('完成') print('第', n, '頁完成')
扒圖步驟分析:(送給有興趣的朋友)
1、獲取網頁源碼
打開mzitu網址,用瀏覽器的F12可以看到網頁的請求過程及源碼
該步驟代碼如下:
1 #coding=utf-8 2 3 import requests 4 5 url = 'http://www.mzitu.com' 6 7 #設置headers,網站會根據這個判斷你的瀏覽器及操作系統,很多網站沒有此信息將拒絕你訪問 8 header = { 9 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 UBrowser/6.1.2107.204 Safari/537.36'} 10 11 #用get方法打開url並發送headers 12 html = requests.get(url,headers = header) 13 14 #打印結果 .text是打印出文本信息即源碼 15 print(html.text)
返回的響應,如果沒問題的話結果和下面類似,這些就是網頁的源碼了。
1 <html> 2 <body> 3 4 ...... 5 6 $("#index_banner_load").find("div").appendTo("#index_banner"); 7 $("#index_banner").css("height", 90); 8 $("#index_banner_load").remove(); 9 }); 10 </script> 11 </body> 12 </html>
2、提取所需信息
- 將獲取的源碼轉換為BeautifulSoup對象
- 使用find搜索需要的數據,保存到容器中
該步驟代碼如下:
1 #coding=utf-8 2 3 import requests 4 from bs4 import BeautifulSoup 5 6 url = 'http://www.mzitu.com' 7 header = { 8 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 UBrowser/6.1.2107.204 Safari/537.36'} 9 10 html = requests.get(url,headers = header) 11 12 #使用自帶的html.parser解析,速度慢但通用 13 soup = BeautifulSoup(html.text,'html.parser') 14 15 #實際上是第一個class = 'postlist'的div里的所有a 標簽是我們要找的信息 16 all_a = soup.find('div',class_='postlist').find_all('a',target='_blank') 17 18 for a in all_a: 19 title = a.get_text() #提取文本 20 print(title)
如下就找到了當頁所有套圖的標題:
1 注意:BeautifulSoup()返回的類型是<class 'bs4.BeautifulSoup'> 2 find()返回的類型是<class 'bs4.element.Tag'> 3 find_all()返回的類型是<class 'bs4.element.ResultSet'> 4 <class 'bs4.element.ResultSet'>不能再進項find/find_all操作
3、進入第二層頁面,進行下載操作
點進一個套圖之后,發現他是每個頁面顯示一個圖片,這時我們需要知道他的總頁數,比如:http://www.mzitu.com/26685是某個套圖的第一頁,后面的頁數都是再后面跟/和數字http://www.mzitu.com/26685/2 (第二頁),那么很簡單了,我們只需要找到他一共多少頁,然后用循環組成頁數就OK
該步驟代碼如下:
1 #coding=utf-8 2 3 import requests 4 from bs4 import BeautifulSoup 5 6 url = 'http://www.mzitu.com/26685' 7 header = { 8 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 UBrowser/6.1.2107.204 Safari/537.36'} 9 10 html = requests.get(url,headers = header) 11 soup = BeautifulSoup(html.text,'html.parser') 12 13 #最大頁數在span標簽中的第10個 14 pic_max = soup.find_all('span')[10].text 15 print(pic_max) 16 17 #輸出每個圖片頁面的地址 18 for i in range(1,int(pic_max) + 1): 19 href = url+'/'+str(i) 20 print(href)
那么我們接下來就是進行尋找圖片地址,保存下來;右鍵MM圖片,點擊檢查可以發現如圖:
1 <img src="https://i5.meizitu.net/2019/07/01b56.jpg" alt="xxxxxxxxxxxxxxxxxxxxxxxxx" width="728" height="485">
如圖所示,上面就是我們MM圖片的具體地址了,保存它即可。
該步驟代碼如下:
1 #coding=utf-8 2 3 import requests 4 from bs4 import BeautifulSoup 5 6 url = 'http://www.mzitu.com/26685' 7 header = { 8 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 UBrowser/6.1.2107.204 Safari/537.36'} 9 10 html = requests.get(url,headers = header) 11 soup = BeautifulSoup(html.text,'html.parser') 12 13 #最大頁數在span標簽中的第10個 14 pic_max = soup.find_all('span')[10].text 15 16 #找標題 17 title = soup.find('h2',class_='main-title').text 18 19 #輸出每個圖片頁面的地址 20 for i in range(1,int(pic_max) + 1): 21 href = url+'/'+str(i) 22 html = requests.get(href,headers = header) 23 mess = BeautifulSoup(html.text,"html.parser") 24 25 26 #圖片地址在img標簽alt屬性和標題一樣的地方 27 pic_url = mess.find('img',alt = title) 28 29 html = requests.get(pic_url['src'],headers = header) 30 31 #獲取圖片的名字方便命名 32 file_name = pic_url['src'].split(r'/')[-1] 33 34 #圖片不是文本文件,以二進制格式寫入,所以是html.content 35 f = open(file_name,'wb') 36 f.write(html.content) 37 f.close()