1 ''' 2 1. 爬取以下站點中各個明星圖片,分別單獨建文件夾存放。 3 起始URL地址:http://www.mm131.com/mingxing 4 ''' 5 import os 6 import logging 7 import requests 8 from bs4 import BeautifulSoup 9 10 logging.basicConfig(level=logging.INFO) 11 12 13 def store_girl_img(girl_url, store_girl_dir): 14 # 把girl_url的單個小姐姐放入store_girl_dir文件夾 15 girl_html = requests.get(girl_url) #訪問girl_url網址 16 girl_html.encoding = "gbk" #修改編碼,不然會是亂碼 17 girl_text = girl_html.text #獲取girl_html的網頁內容。girl_html.content返回的是bytes數據 18 19 girl_src = BeautifulSoup(girl_text, 'lxml').find("div",class_='content-pic').find('img')['src'] 20 #BeautifulSoup用lxml庫解析girl_html的網頁內容,並找到所有class_='content-pic'的div標簽 21 #再找到img標簽下的src屬性,得到單張照片的鏈接 22 print(girl_src) 23 24 # 此處加headers是為防反爬蟲,如果不加會響應403,沒有權限 25 headers = { 26 'Referer': girl_url, 27 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36' 28 } 29 file_name = girl_src.split('/')[-1] 30 #將http://img1.mm131.me/pic/2016/1.jpg切片成["http://img1.mm131.me/pic/2016","1.jpg"],[-1]就是去第二個1.jpg 31 file_name = os.path.join(store_girl_dir, file_name) #在store_girl_dir目錄下創建圖片名字file_name,如1.jpg 32 with open(file_name, 'wb') as f: #二進制模式打開file_name 33 girl_content = requests.get(girl_src, headers=headers).content # .content獲取圖片的二進制數據 34 f.write(girl_content) #寫入到file_name 35 36 37 def store_page_grils(href, store_girl_dir): 38 # 把href這個鏈接下的小姐姐們(多個)放入文件夾store_girl_dir 39 girl_text = requests.get(href).text #訪問某個美女的圖片頁面 40 soup = BeautifulSoup(girl_text, 'lxml') #獲得BeautifulSoup對象 41 # 獲取美女圖片的張數 42 max_page_num = soup.find('div', class_='content-page').find_all('a')[-2].get_text() 43 #找到class_='content-page'的div標簽---->找出該div下所有的a標簽,得到一個a標簽列表 44 #[-2]取出倒數第二個按標簽,get_text()是獲取文本內容 45 max_page_num = int(max_page_num) #文本內容轉化為整數 46 47 girl_url_list = [href] #定義一個列表,存放一個美女所有圖片的鏈接,頁面特殊,href表示第一張 48 #for循環獲取第二張到最后一張的鏈接 49 for page_num in range(2, max_page_num + 1): 50 51 girl_url = str(href).replace(".html",f"_{page_num}.html") # 將.html替換_{page_num}.html 52 # print(girl_url) 53 girl_url_list.append(girl_url) #將第二張到最后一張的鏈接追加到girl_url_list 54 # print(girl_url_list) 55 for girl_url in girl_url_list: 56 store_girl_img(girl_url, store_girl_dir) #循環調用store_girl_img函數 57 58 59 def main(): 60 url = 'http://www.mm131.com/mingxing' 61 store_dir = 'meizitu' #主目錄 62 os.makedirs(store_dir, exist_ok=True) #創建主目錄,若主目錄存在不報錯 63 home_html = requests.get(url) #訪問http://www.mm131.com/mingxing 64 home_html.encoding = "gbk" 65 home_text = home_html.text #獲取網頁內容 66 # 得到小姐姐們的鏈接標簽 67 ahref_list = BeautifulSoup(home_text, 'lxml').find("div",class_="main").find_all('a')[2:22] 68 #找到所有a標簽,得到一個a標簽列表,[2:22]表示:取a標簽列表的第2到21個,因為前兩個是不需要的 69 # print(ahref_list) 70 for ahref in ahref_list: #遍歷這20個a標簽 71 # ahref 是bs4.element.Tag實例 72 girlname = ahref.get_text() # 獲取a標簽的文本內容,作為存放小姐姐圖片的子目錄 73 href = ahref['href']# 取出a標簽的href屬性,得到一個小姐姐圖片的鏈接 74 store_girl_dir = os.path.join(store_dir, girlname) # 拼接得到放該小姐的房間號,即存放美女的文件夾 75 os.makedirs(store_girl_dir, exist_ok=True) 76 logging.info(f'開始下載{girlname}的圖片') 77 store_page_grils(href, store_girl_dir) 78 79 80 if __name__ == '__main__': 81 main() 82 83 84