用Python實現Flickr照片文字資料下載入庫及圖片儲存
阿新 • • 發佈:2018-12-11
語言採用Python,資料庫採用MySQL進行文字資料(照片id,所有者,文字標籤,位置座標,圖片連結)入庫,圖片存放在資料夾。 爬蟲流程: 程式碼如下:
#!/usr/bin/python # -*- coding: UTF-8 -*- import requests import json import time import random import pymysql import urllib import os #建立儲存圖片的資料夾 path='儲存圖片的路徑' if not os.path.isdir(path): os.makedirs(path) paths = path+'\\' #處理特殊字元 def chuli(self): self = self.replace( "'", "\\'") #self = self.replace("/", "") #self =self. replace(chr(0), "") return self #主要的url api='https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=你的key&text=&min_taken_date=2018-05-04&max_taken_date=2018-05-14&woe_id=2347570&extras=description,license,date_upload,date_taken,owner_name,icon_server,original_format,last_update,geo,tags,machine_tags,o_dims,views,media,path_alias,url_sq,url_t,url_s,url_q,url_m,url_n,url_z,url_c,url_l,url_o&per_page=500&format=json&sort=date-taken-asc&jsoncallback=?' r= requests.get(api) a = json.loads(r.text[14:-1]) # 開啟資料庫連線 db = pymysql.connect("localhost","root","123456","mysql" ) # 使用 cursor() 方法建立一個遊標物件 cursor cursor = db.cursor() print(a["photos"]["pages"]) for i in range(a["photos"]["pages"]-1):#進行翻頁,迴圈獲得每頁的url try: s=requests.get(api+"&page="+str(i+1)) print(api+"&page="+str(i+1)) b=json.loads(s.text[14:-1])#去掉外層的jsonFlickrApi()這幾個字串後解析成json的格式 for i in range(len(b["photos"]["photo"])):#迴圈獲取每頁每個照片資料,其中b["photos"]["photo"]為列表,則我們只需按 c = b["photos"]["photo"] #序號獲取每個照片資料 print(c[i]["id"],c[i]["owner"],c[i]["datetaken"],c[i]["latitude"],c[i]["longitude"],c[i]["accuracy"],\ c[i]["place_id"],c[i]["woeid"],c[i]["url_z"],c[i]["description"]["_content"]) content=chuli(c[i]["description"]["_content"]) imgurl = c[i]["url_z"] try: urllib.request.urlretrieve(imgurl,'{}{}.jpg'.format(paths,c[i]["id"])) print('圖片下載成功') except Exception as e: print('爬取圖片失敗') cursor.execute("insert into Hawaii5_4_14(id_1,owner,datetaken,latitude,longitude,accuracy,place_id,woeid,url_z,content) \ VALUES('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')"%(c[i]["id"],c[i]["owner"],c[i]["datetaken"],\ c[i]["latitude"],c[i]["longitude"],c[i]["accuracy"],c[i]["place_id"],c[i]["woeid"],c[i]["url_z"],content)) db.commit() print('第',i+1,'條資料成功插入') time.sleep(2)#休息2秒,防止伺服器拒絕訪問。 except Exception as e: print('爬取失敗') # 關閉資料庫連線 db.close()