我喜欢去ZOL找一些动漫壁纸当作桌面,而一张一张保存显然是太慢了。

那怎么办呢,我们尝试使用简单的爬虫来解决这个问题。

0. 本爬虫目标

  1. 抓取给定分类「或子分类」网址的内容
  2. 分析并得到每个分类下的所有图片专辑
  3. 下载每一个专辑中的图片「每一个专辑对应一个文件夹」

1. 必要的分析

  • 我们打开浏览器,输入http://desk.zol.com.cn/,跳转到ZOL壁纸的首页。
  • 右键 -> 查看源代码
    • 大致浏览一下都有什么东西
    • 我们可以了解到,需要下载一张图片,我们需要选择一个专题
  • 进入专题后,我们通过点击某张图片,可以看到图片的预览
    • 当然这只是预览
    • 我们可以通过点击相应的分辨率,跳转到图片所在的真正页面
  • 进入图片所在页面后,再查看源代码
    • 我们可以找到图片在服务器上的准确位置,这就是我们想要找的地址

2. 简要的思路

  • 我们可以写一个程序,直接从某个专题开始,然后通过寻找该专题中的图片,进行下载。
  • 我这里实现的,是给定一个分类或者子分类,然后下载该分类下的所有图片
    • 比如我可以下载动漫分类下的所有图片
    • 或者我也可以下载动漫分类下的初音未来子分类下的所有图片
  • 那么,我们应该是这样做:
    1. 扒下初音未来子分类的页面内容
    2. 在页面的内容中找到当前页所有专辑对应的URL,并将URL储存起来
    3. 对每一个专辑进行操作 for url in URL
      • 确定专辑中图片数量
      • 进入每一个图片所在的页面:
        • 确定要下载的图片的分辨率「这里我直接默认找最大分辨率」
        • 下载该图片
    4. 判断是否有下一页,有的话继续执行3

3. 先上code为敬

# *-* coding: UTF-8 *-*
__author__ = 'BG'
import urllib2
import os
import re class ZOLPIC: # 初始化ZOLPIC类
# 默认的base地址为ZOL壁纸首页
# 通过手动读入想要下载的图片分类地址
# 创建文件夹
def __init__(self):
self.base_html = "http://desk.zol.com.cn"
print "请输入想要下载的图片分类的网址:"
self.cla_html = raw_input()
if not os.path.exists('./PIC'):
os.mkdir(r'./PIC') # 获取某个页面的内容
def getHtml(self,url):
try:
html = urllib2.urlopen(url)
html = html.read().decode('gbk').encode('utf-8')
return html
except:
return None # 下载图片
# 通过正则表达式对图片地址进行匹配
# 创建文件并写入数据
def downloadPic(self,url,ml):
src_html = re.search(r'<img src="(.*?)">',url).group(1)
pic_name = re.search(r'http.*/(.*[jpg|png])',src_html).group(1)
file_name = r'./PIC/'+ ml + r'/' + pic_name
if os.path.exists(file_name): #已经抓取过
print '图片已经存在 %s' % pic_name
return
picsrc = urllib2.urlopen(src_html).read()
# print picsrc
print '正在下载图片 %s' % pic_name
open( file_name,"wb").write(picsrc) def startCrawler(self):
html = self.getHtml(self.cla_html)
while True:
page = re.search(r'<ul class="pic-list2 clearfix">(.*)</ins></li> </ul>',html,re.DOTALL).group(1)
pic = re.findall(r'href="(/bizhi/.*?html)"',page,re.DOTALL)
for p in pic:
cur_page = self.getHtml(self.base_html+p)
picTotal = int(re.search(r'picTotal : ([0-9]+)',cur_page).group(1))
ml_name = re.search(r'nowGroupName : "(.*?)"',cur_page).group(1)
print '\n\n当前组图名: %s , 共有 %d 张 '%(ml_name,picTotal)
print '-------------------------------------------'
if not os.path.exists(r'./PIC/'+str(ml_name)):
os.mkdir(r'./PIC/'+str(ml_name))
while picTotal > 0 :
ori_screen = re.search(r'oriScreen.*: "(.*?)"',cur_page).group(1)
# print ori_screen
if ori_screen:
full_pic = re.search(r'href="(/showpic/%s.*?.html)'%ori_screen,cur_page).group(1)
# print full_pic
next_page = cur_page
cur_page = self.getHtml(self.base_html+full_pic)
# print cur_page
self.downloadPic(cur_page,ml_name)
cur_page = self.base_html + re.search(r'nextPic.*: "(/bizhi/.*?html)"',next_page).group(1)
cur_page = self.getHtml(cur_page)
picTotal = picTotal - 1
print '-------------------------------------------'
nextPage = re.search(r'<a id="pageNext" href="(.*)" class="next".*?>',html)
if nextPage == None:
return
html = self.getHtml(self.base_html + nextPage.group(1)) if __name__ == '__main__':
spider = ZOLPIC()
spider.startCrawler()

基本的解释已经放在了代码里

  • 通过urlopen()来获取页面
  • 通过open() write()进行写入
  • 通过正则表达式来进行匹配和筛选信息
  • 通过os.path.exists('./PIC')来判断某个路径是否存在,不存在则调用os.mkdir()进行创建

最后就是startCrawler()这个函数,他将我们上面的思路代码化

利用了正则表达式进行匹配,找到我们所需要的URL,再针对URL进行具体的操作

4. 搜刮ZOL吧!

我测试的时候,爬虫总共爬取了2.3GB的图片

效果图如下「推荐在新标签页中打开图片,有惊喜哦」:

5. 一些说明

  • 本爬虫宝宝是单线程的

  • 本宝宝默认下载最大分辨率的图片「因为人家喜欢高清的图片啦」

  • 本宝宝只能在linux系统下运行「原因是我没有处理字符编码问题,在windows下会出现乱码」

python爬虫学习(2) —— 爬一下ZOL壁纸的更多相关文章

  1. python爬虫学习(7) —— 爬取你的AC代码

    上一篇文章中,我们介绍了python爬虫利器--requests,并且拿HDU做了小测试. 这篇文章,我们来爬取一下自己AC的代码. 1 确定ac代码对应的页面 如下图所示,我们一般情况可以通过该顺序 ...

  2. Python爬虫学习之爬美女图片

    最近看机器学习挺火的,然后,想要借助业余时间,来学习Python,希望能为来年找一份比较好的工作. 首先,学习得要有动力,动力,从哪里来呢?肯定是从日常需求之中来.我学Python看网上介绍.能通过P ...

  3. Python爬虫学习 - day1 - 爬取图片

    利用Python完成简单的图片爬取 最近学习到了爬虫,瞬时觉得很高大上,想取什么就取什么,感觉要上天.这里分享一个简单的爬取汽车之家文章列表的图片教程,供大家学习. 需要的知识点储备 本次爬虫脚本依赖 ...

  4. Python爬虫学习(二) ——————爬取前程无忧招聘信息并写入excel

    作为一名Pythoner,相信大家对Python的就业前景或多或少会有一些关注.索性我们就写一个爬虫去获取一些我们需要的信息,今天我们要爬取的是前程无忧!说干就干!进入到前程无忧的官网,输入关键字&q ...

  5. python爬虫学习之爬取全国各省市县级城市邮政编码

    实例需求:运用python语言在http://www.ip138.com/post/网站爬取全国各个省市县级城市的邮政编码,并且保存在excel文件中 实例环境:python3.7 requests库 ...

  6. python爬虫学习01--电子书爬取

    python爬虫学习01--电子书爬取 1.获取网页信息 import requests #导入requests库 ''' 获取网页信息 ''' if __name__ == '__main__': ...

  7. python爬虫学习(1) —— 从urllib说起

    0. 前言 如果你从来没有接触过爬虫,刚开始的时候可能会有些许吃力 因为我不会从头到尾把所有知识点都说一遍,很多文章主要是记录我自己写的一些爬虫 所以建议先学习一下cuiqingcai大神的 Pyth ...

  8. python爬虫学习 —— 总目录

    开篇 作为一个C党,接触python之后学习了爬虫. 和AC算法题的快感类似,从网络上爬取各种数据也很有意思. 准备写一系列文章,整理一下学习历程,也给后来者提供一点便利. 我是目录 听说你叫爬虫 - ...

  9. Python爬虫学习:四、headers和data的获取

    之前在学习爬虫时,偶尔会遇到一些问题是有些网站需要登录后才能爬取内容,有的网站会识别是否是由浏览器发出的请求. 一.headers的获取 就以博客园的首页为例:http://www.cnblogs.c ...

随机推荐

  1. C#基础-技术还债3-枚举【pending】

    /// <summary> /// 声明三方查询类型可以关联的查询对象类型 /// </summary> [AttributeUsage(AttributeTargets.Fi ...

  2. jquery制作论坛或社交网站的每天打卡签到特效

    效果:http://hovertree.com/texiao/jquery/50/ 现在许多社区,购物等网站都设置签到功能,打开可以收获经验.虚拟币等,提高用户粘性,增加浏览量,是一个不错的功能.本文 ...

  3. WCF入门教程(三)定义服务协定--属性标签

    WCF入门教程(三)定义服务协定--属性标签 属性标签,成为定义协议的主要方式.先将最简单的标签进行简单介绍,以了解他们的功能以及使用规则. 服务协定标识,标识哪些接口是服务协定,哪些操作时服务协定的 ...

  4. 【linux草鞋应用编程系列】_6_ 重定向和VT100编程

    一.文件重定向     我们知道在linux shell 编程的时候,可以使用文件重定向功能,如下所示: [root@localhost pipe]# echo "hello world&q ...

  5. linux下tomcat自启动设置

    1.进入/etc/init.d 2.新建文件tomcat,内容如下: #!/bin/sh # chkconfig: 345 99 10 # description: Auto-starts tomca ...

  6. centos 6.0用yum安装中文输入法

    Centos6.2代码 CentOS 6.0没有默认没有装语言支持(Language Support),因此很不方面. 终于发现了有效的方法: su root yum install "@C ...

  7. 关于web软件信息安全问题防护资料的整理 (一)

    之前意识到了安全问题的重要性,于是就在网上找了一下安全问题的解决办法(主要是web应用以及政府网站方面的),问了一下同学的公司是怎么保证安全的,跟我说用的是shiro安全机制这个貌似好多公司都在用,网 ...

  8. ArcGIS中国工具应用:固定比例尺固定纸张批量打印

    ArcGIS中国工具应用:固定比例尺固定纸张批量打印 下载地址:http://files.cnblogs.com/files/gisoracle/a3batchprint.zip 固定A3,比例尺1: ...

  9. 迈出物联网的第一步,玩儿一下Arduino

    大家知道,现在物联网Internet of Things(IoT) 方兴未艾,各种智能设备层出不穷,手表.手环.甚至运动鞋等可穿戴设备,还有智能家居产品,无时无刻不冲击着我们的思想和眼球.Autode ...

  10. Android-socket服务端断重启后,android客户端自动重连

    今天研究这个问题搞了整整一天啊!终于出来了,不过我没有多大的成就感,为什么呢?因为这不是我的劳动成果.同样的问题,我却没想出来!心塞的很啊…… 不过还是要给大家分享一下,希望给大家带来帮助! 先声明一 ...