首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

第二只小爬虫

我们需要另一只更加强壮的小爬虫来实现一些功能,这次的目标是从手机壁纸网站上抓取相册,将高清图片保存到本地,并自动实现文件夹整理。还是老样子,废话不多说,直接开始,Let's rock!

这次我们要爬的是ZOL手机壁纸网站(http://sj.zol.com.cn/bizhi/),如下:

有了之前的一些经验和工具的学习之后,就不用再摸着石头过河了,在着手写代码之前,需要一些思考和顶层设计。比如,找到爬虫的入口(以哪个页面作为起点)、分析一下网页的结构(需要怎么通过一步步链接找到想要的图片)等。

最新手机壁纸( http://sj.zol.com.cn/bizhi/new_1.html)这个网页是个不错的入口,因为里面的相册按时间排序,并且可以翻页,便于循环:

找到这个入口之后,该怎么办呢?每一页都有若干相册,我们点进第一个看看:

一张硕大无比的图片呈现在我们面前!对的,这就是要下的高清图片,然而,这只是图片的展示页面,我们需要进一步获得他的代码,看看图片的具体URL在哪,下一步就把它保存下来就行了。

下面把以上描述的内容变成代码,有些步骤看起来是要多次重用的,为了方便先写成小函数:

获取页面内容:

从入口进入相册、从相册进入一张图片、从图片进入高清图片,每次进入都是重新打开一个url,因此我们需要多次获取页面内容,于是先写一个获取页面内容的函数,输入是页面的url,以及referer,返回页面内容:

注意这里面多加了headers,是因为有些网站采取防盗链机制,用程序获取链接是不会获得响应的,所以headers负责把程序伪装成一个浏览器,并且每次访问随机采用一个浏览器的版本。referer参数用于告诉网站我这个链接是从哪来的,比如,告诉他我是从你主页上的地址过来的,而不是程序直接过来的,也有利于反防盗链。(说多了都是泪,之前爬另外的图片,下载了半天,下下来全是打不开的,研究了好久才知道要这么干)

创建本地目录:

我们希望每一个相册都下载到本地形成一个文件夹,里面装照片,那么自然需要一个函数来建立文件夹,这是个通用的函数,输入是文件夹名称,执行建立文件夹,无返回:

准备工作完成之后,开始程序的主体部分。

因为需要爬的入口也不止一页,所以还得写一个与页码有关的函数,

随后循环调用即可。观察一下入口的URL形式:

果然套路都一样,后面的数字就是页码,那首先把这个页面像第一篇文章一样,创建我们的soup:

注意这里调用了上面定义好的get_content函数,下面还会多次调用。然后我们在页面打开F12审查元素,看看相册们在哪:

其实并不是很难找,忽略一切没用的代码,找到红圈的位置,看到了吗,这个ul标签的下面有一堆li标签,就是一个一个的相册了。所以我们需要先定位这个ul标签,然后在所有li标签里循环:

我们用ul标签的class很容就能定位他,然后调用find_all函数找li。对于每一个li标签,其下面a标签的title属性就是相册的标题,于是我们调用刚才定义好的mkdir函数为其在本地建立一个文件夹;a标签的href属性就是其url(的一部分…所以要在前面加上网站完整的网址)。既然得到了相册的url,下面我们要继续下探到相册去看看下一步怎么办,即这个页面:

文章的最开始已经说了,这个页面,上面大的是预览图,下面小的是缩略图,逻辑是这样的:我先要点击缩略图,然后预览图会变成这个缩略图对应的图片(这时候url会变),然后点击1080*1920那个按钮,才会跳到我要下载的图所在的页面,因此每个缩略图都要循环一次,先要找到对应的url。根据这个思路,打开F12看看究竟:

找到了一个ul标签,下面的所有li标签就是一个一个的缩略图,每一个li标签下面都有一个a标签,其中的href属性就是把这个缩略图放上预览图的页面url,那我自然要在所有照片里循环,那总共相册里有几个相片呢?注意红圈的地方,最后一个li标签的里面有个i标签,里面又有一个em标签,里面的数字就是最后一张图片的位置,所以,一切都有了!

到这一步,我们获得了具体一张照片放在展示页的url,可是还不够啊…烦死了,我要的是高清图!要点击1080*1920那个按钮之后的照片,所以我得知道,点了这个按钮之后,我跳到哪个链接了??继续F12……

搜索一下不难找到,在这个a标签的href属性里,所以这一块这么写:

嗯嗯,链接是找到了,我们在浏览器这面点进去看看是什么鬼:

没错就是这个,我们要的页面,还没够,这只是页面的url知道了,我们还得知道照片的具体url,用于下载,所以继续F12:

这下没跑了,我已经可以轻松拿到最后一个url,然后从url里面再次调用get_content函数获得内容,写入本地文件,大功告成:

整理一下,最后完整的主函数长这样:

加上必要的修饰语句,我们调用一下,这酸爽!:

再看看我们的战果:

学习心得:

不要急着动手,去在浏览器里点一点网页,闭上眼睛想象他们之间的链接关系、循环关系,每点击一次就发生一次页面跳转,就需要get一次页面代码,所以写一些小函数用于代码重用还是必要的。

BeautifulSoup包上一篇文章就有点用错了,对于一个页面需要提取多个信息的情况,最简单的办法就是分别定位,精确查找,而不是先找到一个,再根据相对关系查找,那样的话很容易搞不清两个标签的关系。

没了。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171220G0QNW000?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券