写在前面

在知乎看见有不少人利用python下载了pixabay的图片,发现pixabay上的图片质量确实不错,自己也试着也写了一个小爬虫,权当练手。仅抓取照片的内容

开发环境

系统:win7 64bit
工具:python 2.7.12
IDE:pycharm 6.3

正式开始

url分析

以第2页的url为例:
总页数:165
每页图片量:60
获取方法:GET
https://pixabay.com/zh/editors_choice/?media_type=photo&pagi=2

看下“?”后的参数:
media_type :类型,这里抓取的图片,所以为photo
pagi:对应为页码,改动该参数实现对各页的访问

关于网页的请求,我们可以构造一个循环遍历访问。

内容分析

看下可抓取的字段

  • 图片网址
  • 作者名
  • 点赞数
  • 收藏量
  • 评论数

右键选择核查元素,查看源代码中数据的位置

网页内容解析
根据源码公布的数据配置相应的正则表达式,此处也可以用xpath、Beautifulsoup进行数据提取:

 re.compile(r'srcset="(?P<url>\S+).*?<em.*?</i>(?P<zz>.*?)</em.*?<em.*?</i>(?P<sc>.*?)</em.*?<em.*?</i>(?P<pj>.*?)</em.*?<a.*?>(?P<author>.*?)</a',re.S)

连接mysql数据库
通过MySQLdb模块连接mysql数据库,进行操作,定义一个datasave函数,详见代码:

    def datasave(self):print u'开始连接mysql数据库'try:conn = MySQLdb.connect(host='localhost',port=3306,user='root',passwd='',db='python_test',charset='utf8')#获取操作游标cur = conn.cursor()cur.execute('DROP TABLE IF EXISTS PIXABAY')sql='''CREATE TABLE PIXABAY(URL VARCHAR(200) NOT NULL,ZCOUNTS INT ,SCOUNTS INT,PJCOUNTS INT,AUTHER VARCHAR(200)) '''cur.execute(sql)print u'数据表已经创建,可以开始导入数据'if len(self.data)!=0:for data in self.data:print data['url'], data['zcounts'], data['scounts'], data['pjcounts'],data['auther']cur.execute("INSERT INTO PIXABAY(URL,ZCOUNTS,SCOUNTS,PJCOUNTS,AUTHER) VALUES(%s,%s,%s,%s,%s)",(data['url'],data['zcounts'],data['scounts'],data['pjcounts'],data['auther']))conn.commit()cur.close()conn.close()print u'数据已经全部插入库'except Exception,e:print u"错误原因",e

核查结果

1、程序运行起来看着还不错,一页60个图片,。当然,在刚开始运行并不是那么顺利,报出了不少异常。这些异常稍候总结。

2、运行完,查看下mysql中的数据量,共抓到9780个记录(少抓了一页,网站共有165页,我代码中的页数只抓到164页,最后一页没有抓),前4行记录的结果基本满足抓取的要求

3、统计下所抓取的数据
关于图片作者的top10排名
第一名共分享了489张图片,前三名分享的图片量相差大概在100左右,排名越向后,差距越小。

看下图片量top10的点赞量情况
分享量第一的PublicDomainPictures,点赞量当之无愧的第一,不仅量多,质量也是棒棒哒。但往下看,差异化就很明显了。分享量排名第7的Unsplash点赞量排名第三,看来分享的都是精品【微笑】。

按点赞量排名查看

按分享量排名查看点击量

还可以从收藏量、时间(网址中有)、评论量等维度进行分析,这里就不展开啦

异常汇总

  • 正则匹配的时候,url定位的是img标签中src属性,发现抓到的数量不对,改为srcset就可以全部抓取了
  • 向mysql数据插入数据的时候,在VALUES(%s,%s,%s,%s,%s)中的%s加上引号,去除就可以正常运行了

完整代码

以下是完整代码:

# -*- coding:utf-8 -*-
import reimport MySQLdbfrom lxml import etreeimport requestsclass pixabayspide():def __init__(self):self.data = []def geturls(self,url):#构造头部headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64)'}try:html = requests.get(url,headers=headers)html_doc = html.contentreturn html_doc   #返回源代码except Exception ,e:print u"连接网页失败,错误原因", eprint u"%s爬取异常,请核实"  %urldef htmlparse(self,page):#正则获取网页数据patent = re.compile(r'srcset="(?P<url>\S+).*?<em.*?</i>(?P<zz>.*?)</em.*?<em.*?</i>(?P<sc>.*?)</em.*?<em.*?</i>(?P<pj>.*?)</em.*?<a.*?>(?P<author>.*?)</a',re.S)html_page = patent.findall(page)for html_doc in html_page:datadic = {}datadic['url'] = html_doc[0].replace('__340', '_960_720')  #转换下图片像素,参考知乎崔斯特[微笑]datadic['zcounts'] = int(html_doc[1].strip())datadic['scounts'] = int(html_doc[2].strip())datadic['pjcounts'] = int(html_doc[3].strip())datadic['auther'] = html_doc[4]self.data.append(datadic)print u'已经抓取%d个记录' %len(self.data)# for data in self.data:#   print data['url'], data['zcounts'], data['scounts'], data['pjcounts']def datasave(self):print u'开始连接mysql数据库'try:conn = MySQLdb.connect(host='localhost',port=3306,user='root',passwd='',db='python_test',charset='utf8')#获取操作游标cur = conn.cursor()cur.execute('DROP TABLE IF EXISTS PIXABAY')sql='''CREATE TABLE PIXABAY(URL VARCHAR(200) NOT NULL,ZCOUNTS INT ,SCOUNTS INT,PJCOUNTS INT,AUTHER VARCHAR(200)) '''cur.execute(sql)print u'数据表已经创建,可以开始导入数据'if len(self.data)!=0:for data in self.data:# print data['url'], data['zcounts'], data['scounts'], data['pjcounts'],data['auther']cur.execute("INSERT INTO PIXABAY(URL,ZCOUNTS,SCOUNTS,PJCOUNTS,AUTHER) VALUES(%s,%s,%s,%s,%s)",(data['url'],data['zcounts'],data['scounts'],data['pjcounts'],data['auther']))conn.commit()cur.close()conn.close()print u'数据已经全部插入库'except Exception,e:print u"错误原因",eif __name__=='__main__':spide = pixabayspide()for i in range(1,165):url = 'https://pixabay.com/zh/editors_choice/'+'?media_type=photo&pagi='+str(i)page = spide.geturls(url)spide.htmlparse(page)print '已经完成第%d页数据的抓取' % ispide.datasave()

设想

  • 从mysql中取出top100的图片进行下载,提取这些图片中的主要色调

最后希望对看到此处的你有所帮助【微笑】

【实战】爬虫实战-pixabay图片存储mysql相关推荐

  1. yspider爬取数据导入mysql_爬虫实战四、PyCharm+Scrapy爬取数据并存入MySQL

    一.创建爬虫项目 注意:不能直接使用PyCharm创建Scrapy项目,所以需要在爬虫实战三.PyCharm搭建Scrapy开发调试环境的基础(PyCharm配置完Scrapy)之上,选中mySpid ...

  2. python3爬虫实例-自己动手,丰衣足食!Python3网络爬虫实战案例

    本教程是崔大大的爬虫实战教程的笔记:网易云课堂 Python3+Pip环境配置 用到的IDE是PyCharm,Windows下到官网下载就行(Professional版本):http://www.je ...

  3. Python爬虫实战六之抓取爱问知识人问题并保存至数据库

    大家好,本次为大家带来的是抓取爱问知识人的问题并将问题和答案保存到数据库的方法,涉及的内容包括: Urllib的用法及异常处理 Beautiful Soup的简单应用 MySQLdb的基础用法 正则表 ...

  4. python教学视频a_2019何老师一个月带你玩转Python分布式爬虫实战教程视频(视频+源码)...

    ├─章节1-爬虫前奏(官网免费) │ 001.爬虫前奏_什么是网络爬虫.mp4 │ 002.爬虫前奏_HTTP协议介绍.mp4 │ 003.爬虫前奏_抓包工具的使用网络请求.mp4 │ ├─章节2-网 ...

  5. Python3 爬虫实战 — 58同城武汉出租房【加密字体对抗】

    爬取时间:2019-10-21 爬取难度:★★★☆☆☆ 请求链接:https://wh.58.com/chuzu/ 爬取目标:58同城武汉出租房的所有信息 涉及知识:网站加密字体的攻克.请求库 req ...

  6. python3 简单爬虫实战|使用selenium来模拟浏览器抓取选股宝网站信息里面的股票

    对爬虫的简单介绍 1.    什么是爬虫? 请求页面并提取数据的自动化过程. 2.    爬虫的基本流程 (1) 发起请求:通过url向服务器发起request请求,请求可以包含额外的header信息 ...

  7. python3爬虫实战姚良_Python3.X 爬虫实战(缓存与持久化)

    [工匠若水 http://blog.csdn.net/yanbober 未经允许严禁转载,请尊重作者劳动成果.私信联系我] 1 背景 不知不觉关于 Python 3.X 爬虫系列已经介绍了如下系列: ...

  8. python实例100例百度文库-18个Python爬虫实战案例(已开源)

    目录 爬虫小工具 文件下载小助手 爬虫实战 笔趣看小说下载 VIP视频下载 百度文库文章下载_rev1 百度文库文章下载_rev2 <帅啊>网帅哥图片下载 构建代理IP池 <火影忍者 ...

  9. python爬虫实战——猫眼电影案例

    python爬虫实战--猫眼电影案例 ·背景   笔者上一篇文章<基于猫眼票房数据的可视化分析>中爬取了猫眼实时票房数据,用于展示近三年电影票房概况.由于数据中缺少导演/演员/编剧阵容等信 ...

最新文章

  1. SVM进行手写数字识别
  2. python有道翻译-使用python2爬取有道翻译
  3. yolov5的3.0版本代码在训练的时候报错:ImportError: cannot import name ‘amp‘ from ‘torch.cuda‘ 以及yolov5的3.0环境安装
  4. matlab 矩阵加减乘除运算
  5. Caffe应用篇----文件格式转换
  6. 关于OSPF用反掩码
  7. python新手输出错误,Python 新手常犯错误(第一部分)
  8. jQuery基础学习笔记(下)
  9. SQL Server 2016如何创建数据库
  10. 基于php的小区物业管理系统
  11. linux开发员用游戏本吗,为什么很多程序员使用thinkpad而不是同等价位的游戏本呢?...
  12. PPT加密了如何打开文件
  13. rm -rf 误删除数据如何进行恢复
  14. 外媒眼中的乔布斯:他就是苹果
  15. BGP路径属性与选路原则
  16. 嵌入式新闻早班车-第13期
  17. 让我摘下星星送给你_抖音中摘下星星给你摘下月亮的歌词是什么歌 星球坠落歌词在哪听...
  18. HBuilderx打包h5的APP,解决获取相机权限问题
  19. 苹果平板一定要用原装笔吗?苹果平板电容笔推荐
  20. Mediapipe 基于KNIFT如何输出识别数据

热门文章

  1. 云服务卸载MySQL
  2. 【231】判断是否是2的次幂--位运算相关
  3. jquery加载页面的几种方法(页面加载完成就执行)
  4. Linux基本操作4
  5. 21315陈泽华——个人征信体系的构成
  6. 对rman命令report obsolete的一点说明
  7. 网易2017秋招编程题集合
  8. 【腾讯云 Finops Crane 集训营】降本增效利器Crane应用实战
  9. Linux安装maven
  10. 支付的那些事——领域模型篇