1 import io 2 import os 3 import re 4 import sys 5 import datetime 6 from bs4 import BeautifulSoup 7 from pxydowwload import request 8 from pymongo import MongoClient 9 10 sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') 11 12 13 class mzitu(): 14 def __init__(self): 15 client = MongoClient('192.168.200.11', 27017) 16 db = client["mzitulg"] 17 self.mzitu_collection = db["mzitulg"] 18 self.title = '' 19 self.url = '' 20 self.img_urls = [] # 初始化一個 列表 用來保存圖片地址 21 22 def all_url(self, url): 23 html = request.get_agent(url, 3) 24 # html = self.request(url) # 調用request函數把套圖地址傳進去會返回給我們一個response 25 all_a = BeautifulSoup(html.text, 'lxml').find( 26 'div', class_='postlist').find_all('a')[0:47] 27 # print(len(all_a)) 28 for i in range(1, len(all_a) - 1, 2): 29 a = all_a[i] 30 title = a.get_text() 31 self.title = title 32 print(u'開始保存:', title) # 加點提示不然太枯燥了 33 # 我注意到有個標題帶有 ? 這個符號Windows系統是不能創建文件夾的所以要替換掉 34 path = str(title).replace("?", '_') 35 self.mkdir(path) # 調用mkdir函數創建文件夾!這兒path代表的是標題title哦!!!!!不要糊塗了哦! 36 #os.chdir("/Users/ang/Pictures/mzitu.com/" + path) 37 href = a['href'] 38 # 調用html函數把href參數傳遞過去!href是啥還記的吧? 就是套圖的地址哦!!不要迷糊了哦! 39 self.url = href # 將頁面地址保存到self.url中 40 if self.mzitu_collection.find_one({'主題頁面地址': href}): 41 print(u'這個頁面已經爬取過!') 42 else: 43 self.html(href) 44 45 def html(self, href): # 這個函數是處理套圖地址獲得圖片的頁面地址 46 html = request.get_agent(href, 3) 47 #html = self.request(href) 48 max_span = BeautifulSoup(html.text, 'lxml').find_all('span')[ 49 8].get_text() 50 page_num = 0 51 for page in range(1, int(max_span) + 1): 52 page_num += 1 53 page_url = href + '/' + str(page) 54 # 調用img函數,把上面我們我們需要的兩個變量,傳遞給下一個函數。 55 self.img(page_url, max_span, page_num) 56 57 def img(self, page_url, max_span, page_num): # 這個函數處理圖片頁面地址獲得圖片的實際地址 58 img_html = request.get_agent(page_url, 3) 59 #img_html = self.request(page_url) 60 img_url = BeautifulSoup(img_html.text, 'lxml').find( 61 'div', class_='main-image').find('img')['src'] 62 self.save(img_url) 63 self.img_urls.append(img_url) 64 65 if int(max_span) == page_num: 66 self.save(img_url) 67 post = { # 這是構造一個字典,里面有啥都是中文,很好理解吧! 68 '主題頁面標題': self.title, 69 '主題頁面地址': self.url, 70 '主題圖片地址': self.img_urls, 71 '主題獲取時間': datetime.datetime.now() 72 } 73 self.mzitu_collection.save(post) 74 print(u'插入數據庫成功!') 75 else: 76 self.save(img_url) 77 78 def save(self, img_url): # 這個函數保存圖片 79 name = img_url[-9:-4] 80 print(u'開始保存:', img_url) 81 img = request.get_agent(img_url, 3) 82 #img = self.request(img_url) 83 fp = open(name + '.jpg', 'ab') 84 fp.write(img.content) 85 fp.close() 86 87 def mkdir(self, path): # 這個函數創建文件夾 88 path = path.strip() 89 isExists = os.path.exists(os.path.join( 90 "/Users/ang/Pictures/mzitu.com", path)) 91 if not isExists: 92 print(u'建了一個名字叫做', path, u'的文件夾!') 93 os.makedirs(os.path.join( 94 "/Users/ang/Pictures/mzitu.com", path)) 95 os.chdir(os.path.join("/Users/ang/Pictures/mzitu.com", path)) 96 # # 切換到目錄 97 return True 98 else: 99 print(u'名字叫做', path, u'的文件夾已經存在了!') 100 os.chdir(os.path.join("/Users/ang/Pictures/mzitu.com", path)) 101 return False 102 103 """ 104 def request(self, url): # 這個函數獲取網頁的response 然后返回 105 headers = { 106 'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"} 107 content = requests.get(url, headers=headers) 108 return content 109 """ 110 111 112 Mzitu = mzitu() # 實例化 113 # 給函數all_url傳入參數 你可以當作啟動爬蟲(就是入口) 114 Mzitu.all_url('http://www.mzitu.com/xinggan')