[Python]爬取mzitu網站


  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')

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM