Advertisement
rs6000

crawler_meizitu_03_mongoDB

Feb 13th, 2017
712
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.89 KB | None | 0 0
  1. '''
  2. author:smilehsu
  3. blog:smilehsu.cc
  4. requirements:Windows7、python3.52
  5. date:2017/02/14
  6. 程式用物件化改寫
  7.  
  8. 2017/02/14 10am
  9. 加入 MongoDB
  10.  
  11. '''
  12.  
  13. import os, datetime, requests, shutil
  14. from bs4 import BeautifulSoup
  15. from pymongo import MongoClient
  16.  
  17. #base_url='http://meizitu.com/a/'
  18.  
  19. all_link=[]
  20. error_page=[]
  21. dir_path='d:\meizitu'
  22.  
  23. class meizitu():
  24.    
  25.     def __init__(self):
  26.         client=MongoClient()
  27.         db=client['crawlerDB']
  28.         self.meizitu_collection=db['meizitu']
  29.         self.title=''
  30.         self.url=''
  31.         self.img_urls=[]
  32.    
  33.    
  34.  
  35.     def all_url(self,url,maxpage):
  36.         for i in range(1,maxpage+1):
  37.             page_url=url+str(i)+'.html'
  38.             all_link.append(page_url)
  39.        
  40.         for p in all_link:
  41.             html=self.request(p)
  42.             soup=BeautifulSoup(html.text,'lxml')
  43.            
  44.             try:
  45.                 #取得頁面的title跟該頁面的圖片連結
  46.                 title=soup.find('div',{'class':'metaRight'}).find('a')
  47.                 #取得圖片連結
  48.                 img_url=soup.find('div',{'class':'postContent'}).find_all('img')
  49.                 #測試用 印出頁面的title
  50.                 print(title.text)
  51.                 #測試用
  52.                 #print(len(img_url),img_url)
  53.                 #要存圖片的資料夾檔名就用頁面的title
  54.                 dirname=title.text
  55.                 #存資料庫
  56.                 self.title=title.text
  57.                 self.url=title['href']
  58.                
  59.                 #判斷是否已抓取
  60.                 if self.meizitu_collection.find_one({'頁面連結':self.url}):
  61.                     print('該頁面已抓取過')
  62.                 else:
  63.                     #建立資料夾
  64.                     self.mkdir(dirname)
  65.                     #儲存圖檔
  66.                     self.save(img_url)
  67.                
  68.             except:
  69.                 print('error: {}'.format(p))
  70.                 error_page.append(p)
  71.                 pass
  72.            
  73.     def request(self,url):
  74.         headers = {'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}
  75.         res = requests.get(url, headers=headers,stream=True)
  76.         res.encoding='gb2312'
  77.         return res
  78.    
  79.     def mkdir(self, dirname):
  80.         dirname=dirname.strip()
  81.         isExists = os.path.exists(os.path.join(dir_path, dirname))
  82.         mydir_path=os.path.join(dir_path, dirname)
  83.  
  84.        
  85.         if not isExists:
  86.             print('建立資料夾:'+mydir_path)
  87.             os.makedirs(mydir_path)
  88.             os.chdir(mydir_path)
  89.             return True
  90.  
  91.         else:
  92.             print('資料夾已存在'+mydir_path)
  93.             os.chdir(mydir_path)
  94.             return False
  95.    
  96.     def save(self, img_url):
  97.         for pic in img_url:
  98.             #路徑check
  99.             #print('目前工作目錄:'+os.getcwd())
  100.             #頁面裡的圖片連結
  101.             pic_src=pic['src']
  102.            
  103.            
  104.             #圖檔的連結存到資料庫
  105.             self.img_urls=pic_src
  106.            
  107.            
  108.             post = {
  109.                 '頁面標題': self.title,
  110.                 '頁面連結': self.url,
  111.                 '圖片連結': self.img_urls,
  112.                 '下載時間': datetime.datetime.now()
  113.             }
  114.             self.meizitu_collection.save(post)
  115.            
  116.             print('要下載的圖檔連結'+pic_src)
  117.             #下載圖片後要存檔的檔名
  118.             #pic_name=dir_name+'_'+pic_src.split('/')[-1]
  119.             pic_name=pic_src.split('/')[-1]
  120.             #下載圖片
  121.             get_pic=self.request(pic_src)
  122.             f=open(pic_name,'wb')
  123.             shutil.copyfileobj(get_pic.raw,f)
  124.             f.close()
  125.             del get_pic
  126.  
  127. Meizitu=meizitu()
  128. Meizitu.all_url(url='http://meizitu.com/a/',maxpage=5)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement