语言采用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()