Python在手,花瓣上面的美女,我全都要!

(男人,皆爱美。尊严让我们不能做舔狗,那么我们就用技术爬!)

关注小编后私信【PDF】领取十套电子文档书籍

Python在手,花瓣上面的美女,我全都要!

现在的美女真的是太多?

Python在手,花瓣上面的美女,我全都要!

载入包、读取url函数

Python在手,花瓣上面的美女,我全都要!

获取相册

Python在手,花瓣上面的美女,我全都要!

获取相册中图片url、下载

Python在手,花瓣上面的美女,我全都要!

看蒙了吧,也许你看过直播视频,但会发现我的程序跟他写的有差别,那是因为我用了多线程来加速,这个概念专栏里大神也说过,我把它用到了这里来。因为。。。美女太多了嘛


老样子我们来逐个解释一下:

1.获取url的函数得到的是json格式,这里是偷个懒,直接在功能函数里.json了,其实可以不用,不过就需要在下文调用函数之后加上.json,因为要到的是json格式下的[' ']属性值,text不便于获取

2.解释一下get的参数

1.url——花瓣网首页

2.params是我们附加的url信息,其中:

1.'j0ga0hbi' 我也不知道是什么,那就不管他

2.'max' : '1928153623' 这个比较关键,需要细说一下,网页分为两种,一种是单纯一面,你的操作不影响网页地址的,还有一种就是操作影响该页的地址,比如:下拉加载更多。而我们这么多照片当然就是属于下来越来越多来吸引你。那么这和max参数有什么关系呢?看图

Python在手,花瓣上面的美女,我全都要!

元素检查

Ctrl+shift+C点击一张你喜欢的图片,显示如上图所示元素,在高亮处周围即可找到该相册的链接地址(/pins/1931768331),我们可以打开这个网页看一下(“http://huaban.com"+"/pins/1931768331/")是不是我们要的这个相册,这里我告诉你是。此时直接xpath定位,get,就得到我们期望的内容了?

不!原因?因为这里是异步加载(就是上文说的第二种网页形式)

打开花瓣首页,F12,选中XHR,然后往下翻,发现每当页面加载新图片的时候,会发送一个新请求!这个请求就是异步加载请求!

熟悉吗?最底下4个参数就是我们给的param,而max这下是不是眼熟了?没错,就是我们刚才获取的pins不是吗?!

省去你来回查看的功夫,直接告诉你,下一条请求的max就是上一条请求获取到的最后一个pin_id!(pins是相册编号,pin_id是图片编号,其实相册编号也是图片编号)什么意思呢?就是说加载新图片之前的页面上最后一张图的pins就是发送异步请求后加载的第一张图的max!那么这个加载的机制也就是根据图片而来的,而不是固定加载某些图片。我加载的下一页图片是什么取决于已显示的最后一张图片的pins。

所以我们这里get需要给参数param

Python在手,花瓣上面的美女,我全都要!

异步加载

'limit' : '100' 限制最大加载图片数

'wfl' : '1' 不知道,就跟着它本身走

3.headers——请求头,关于网页接收编码啊,表现形式啊,客户端信息之类的,详细的自己谷歌

3.之后就是多线程完成网址爬取任务,说明一下参数n的含义。上面已经说了异步加载会加载更多图片,这里我让n=0,并只执行一次循环,其实就是不让他只往后加载一次图片,因为我现在并不为了爬图,而是为了测试我的程序,加载太多没必要,浪费时间(每次调试我也是对了就ctrl+c的)。而至于为什么把这个循环留在这里,当然为了日后如果。。。咳咳,有需要的话,可以多爬些美女嘛。

4.有了相册的网址,那么下一步就是进入相册中去爬这相册中的图片了。步骤没有太大变化,因为是同一网站上的图片爬取,注意xpath即可

5.下载保存


这里还是说明一下,原本以为用了多线程,图片爬取会快很多,但实际结果并没有那么明显。我觉得可能是网速限制的原因。本身url的多线程由于网址不多且构造相对简单,所以速度上提升不明显,加上下载图片最大受限于网速,所以整个提速并没有那么显著。(甚至觉得不用那么麻烦,单线程的话程序简单并且清晰得多)

那,我知道你们想什么:那就给我们单线程的程序啊!

给啊!看招!


Python在手,花瓣上面的美女,我全都要!

单线程程序部分1

Python在手,花瓣上面的美女,我全都要!

相关推荐