我喜欢去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. Java--对象池化技术 org.apache.commons.pool2.ObjectPool

    org.apache.commons.pool2.ObjectPool提供了对象池,开发的小伙伴们可以直接使用来构建一个对象池 使用该对象池具有两个简单的步骤: 1.创建对象工厂,org.apache ...

  2. spring入门(六)【springMVC中各数据源配置】

    在使用spring进行javaWeb开发的过程中,需要和数据库进行数据交换,为此要经常获取数据库连接,使用JDBC的方式获取数据库连接,使用完毕之后再释放连接,这种过程对系统资源的消耗无疑是很大的,这 ...

  3. 16、ASP.NET MVC入门到精通——MVC过滤器

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 在ASP.NET MVC中有四种过滤器类型

  4. java web学习总结(七) -------------------HttpServletResponse对象(一)

    Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要 ...

  5. Understanding glibc malloc【待译】

    今天尝试用Valgrind调试程序时,发现堆和栈的一些问题没有理解透彻,于是Google了下"Memory Layout C",接着就通过Memory Layout of C Pr ...

  6. 轻量的、可自定义 CSS 的 Lightbox 相册插件

    jQuery LightGallery是一个轻量级的,可定制的,模块化的,响应式的 jQuery 相册插件.它采用 CSS 来实现图像和视频的大小调整.因此,这将是非常灵活的,并且比使用 JavaSc ...

  7. FusionCharts的使用方法(超详细)

    今天统计价格变化规律的时候找到的一个很好的文档,很详细 一.简介 Ø FusionCharts 是InfoSoft Global 公司的一个产品,InfoSoft Global 公司是专业的Flash ...

  8. First,FirstOrDefault,Single,SingleOrDefault的区别

    操作符 如果源序列是空的 源序列只包含一个元素 源序列包含多个元素 First 抛异常 返回该元素 返回第一个元素 FirstOrDefault 返回default(TSource) 返回该元素 返回 ...

  9. mysql存储过程详解

    mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的S ...

  10. yum使用点滴

    yum下载依赖rpm包 先安装一个yum-downloadonly 1 yum install yum-downloadonly完成安装后,yum –help在最后就提示两个命令参数,分别是: Plu ...