Advertisement
rs6000

crawler_meizitu_04_Sqlite

Feb 18th, 2017
638
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.72 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/22
  9. 加入 sqlite
  10.  
  11. '''
  12.  
  13. import os, requests, shutil
  14. import sqlite3 as lite
  15. from bs4 import BeautifulSoup
  16.  
  17. #base_url='http://meizitu.com/a/'
  18. fk=1
  19. all_link=[]
  20. error_page=[]
  21. dir_path='d:\meizitu'
  22. sqlite_path='d:\meizitu\meizituDB.sqlite'
  23.  
  24. #sql語法
  25. #如果資料庫已經album資料表就刪掉它
  26. sql1="DROP TABLE IF EXISTS 'album';"
  27. #建立新的 album資料表
  28. sql2="CREATE TABLE 'album' ('id' INTEGER PRIMARY KEY  NOT NULL , 'title' VARCHAR);"
  29. #如果資料庫已經album_images資料表就刪掉它
  30. sql3="DROP TABLE IF EXISTS 'album_imags';"
  31. #建立新的 album_images資料表
  32. #FOREIGN KEY(album_id) REFERENCES album(id) 設定 album_id為Foreign Key,跟album資料表中的id連結
  33. sql4="CREATE TABLE 'album_imags' ('img_id' INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL , 'album_id' INTEGER NOT NULL ,\
  34. 'title' VARCHAR NOT NULL , 'img_src' VARCHAR NOT NULL ,FOREIGN KEY(album_id) REFERENCES album(id) );"
  35.  
  36. #資料庫連線,如果路徑底下沒有meizituDB.sqlite則會自動建立
  37. conn= lite.connect(sqlite_path)
  38.  
  39. #在爬蟲程式開始運作前,先建立資料庫
  40. cur=conn.cursor()
  41. cur.execute(sql1)
  42. cur.execute(sql2)
  43. cur.execute(sql3)
  44. cur.execute(sql4)
  45. conn.commit()
  46. conn.close()
  47.  
  48. class meizitu():
  49.  
  50.     def all_url(self,url,maxpage):
  51.         for i in range(1,maxpage+1):
  52.             page_url=url+str(i)+'.html'
  53.             all_link.append(page_url)
  54.        
  55.         #計數器
  56.         counter=1
  57.         for p in all_link:
  58.             html=self.request(p)
  59.             soup=BeautifulSoup(html.text,'lxml')
  60.            
  61.             try:
  62.                 #取得頁面的title跟該頁面的圖片連結
  63.                 title=soup.find('div',{'class':'metaRight'}).find('a')
  64.                 #取得圖片連結
  65.                 img_url=soup.find('div',{'class':'postContent'}).find_all('img')
  66.                
  67.                 #測試用 印出頁面的title
  68.                 #print(title.text)
  69.                
  70.                 #測試用
  71.                 #print(len(img_url),img_url)
  72.                
  73.                 #要存圖片的資料夾檔名就用頁面的title
  74.                 dirname=title.text
  75.                
  76.                 #寫入資料庫
  77.                 album_sql="insert or ignore into album values({},'{}');".format(counter,dirname)
  78.                 #測試sql語法
  79.                 #print('insert_sql=',album_sql)
  80.                              
  81.                 conn= lite.connect(sqlite_path)
  82.                 cur=conn.cursor()
  83.                 cur.execute(album_sql)
  84.                 conn.commit()
  85.                 conn.close()
  86.                
  87.                 #建立資料夾
  88.                 self.mkdir(dirname)
  89.                
  90.                 fk=counter
  91.                 #check fk value in main()
  92.                 #print('main()裡的fk值',fk)
  93.                
  94.                 #儲存圖檔
  95.                 self.save(img_url,dirname,fk)
  96.                
  97.                 counter+=1
  98.                
  99.             except Exception as e:
  100.                 print('error: {}'.format(e))
  101.                 error_page.append(p)
  102.                 pass
  103.            
  104.     def request(self,url):
  105.         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"}
  106.         res = requests.get(url, headers=headers,stream=True)
  107.         res.encoding='gb2312'
  108.         return res
  109.    
  110.     def mkdir(self, dirname):
  111.         dirname=dirname.strip()
  112.         DisExists = os.path.exists(os.path.join(dir_path, dirname))
  113.         mydir_path=os.path.join(dir_path, dirname)
  114.  
  115.        
  116.         if DisExists==0:
  117.             print('建立資料夾:'+mydir_path)
  118.             os.makedirs(mydir_path)
  119.             os.chdir(mydir_path)
  120.             return True
  121.  
  122.         else:
  123.             print('資料夾已存在'+mydir_path)
  124.             os.chdir(mydir_path)
  125.             return False
  126.    
  127.     def save(self, img_url,dirname,fk):
  128.         #check fk value in save()
  129.         #print('save()裡的 fk值=',fk)
  130.        
  131.         for pic in img_url:
  132.             #路徑check
  133.             #print('目前工作目錄:'+os.getcwd())
  134.            
  135.             #頁面裡的圖片連結
  136.             pic_src=pic['src']
  137.             #測試用
  138.             #print('要下載的圖檔連結'+pic_src)
  139.            
  140.             #下載圖片後要存檔的檔名
  141.             pic_name=pic_src.split('/')[-1]
  142.                      
  143.             #寫入資料庫
  144.             img_sql="INSERT INTO album_imags (album_id,title,img_src) VALUES ({},'{}','{}');".format(fk,dirname,pic_src)
  145.             #check sql語法
  146.             #print('table img sql=',img_sql)
  147.             #寫入資料庫
  148.             conn= lite.connect(sqlite_path)
  149.             cur=conn.cursor()
  150.             cur.execute(img_sql)
  151.             conn.commit()
  152.             conn.close()
  153.            
  154.             #下載圖片後要存檔的檔名
  155.             #檢查檔案是否已經存存在
  156.             #存檔的名稱與下載的圖檔名稱一樣
  157.             #所以可以判斷是否已經下載過
  158.             FisExists = os.path.exists(pic_name)
  159.             if FisExists ==1:
  160.                 print('檔案{}已存在'.format(pic_name))
  161.             else:
  162.                 #下載圖片
  163.                 print('開始下載{}'.format(pic_name))
  164.                
  165.                 #先停用下載功能
  166.                 #get_pic=self.request(pic_src)
  167.                 #f=open(pic_name,'wb')
  168.                 #shutil.copyfileobj(get_pic.raw,f)
  169.                 #f.close()
  170.                 #del get_pic
  171.  
  172. Meizitu=meizitu()
  173. Meizitu.all_url(url='http://meizitu.com/a/',maxpage=50)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement