今天我们就来爬爬这个网站 https://tu.enterdesk.com/ 这个网站能爬的资源还是很多的,但我就写一个例子,其他的可以根据思路去写。
首先还是先来分析下这个网站的图片获取过程

我选择的是图库,先随便选择一个标签,我这选宠物吧

哟,我们再看看有没有翻页 开启F12(开发者工具)
用不习惯火狐,还是开谷歌来看吧

那么就访问看看?随便选取一个访问看看是不是能出图片
https://tu.enterdesk.com/chongwu/6.html
结果肯定是可以的啦
问题来了,现在怎么查看最后一页的页码是什么?一种是无限循环下去 直到 没有图片标签的时候报错,还有一种就是从源码中找出页码 那就得看有没有页码按钮 刚才滚轮比较快 现在慢一点 看有没有页码这些东西

这网站还是有页码的,那说明在html源码中能找到页码数
两种方法:
F12工具选择元素

Ctrl+U走一波 源代码直接搜索

现在找到所有页码,接下来就是分析图片源地址了

选择目标图片看看是不是源地址 原图 打开一看其实不是
https://up.enterdesk.com/edpic_360_360/4c/3e/c2/4c3ec2be7061121ad5994a9b51241fa3.jpg
现在再点击进去图片里面 发现是原图了 这时再选择图片查看标签的图片链接

复制上图里面的链接 打开一看就是原图啦 看下图的链接 怎么那么熟悉?

对比下两个链接
https://up.enterdesk.com/edpic_360_360/4c/3e/c2/4c3ec2be7061121ad5994a9b51241fa3.jpg
https://up.enterdesk.com/edpic_source/4c/3e/c2/4c3ec2be7061121ad5994a9b51241fa3.jpg
略缩图 edpic_360_360
原图 edpic_source
这下整体思路就有啦,我们可以获取略缩图的链接将url进行重构,形成原图链接,然后再批量下载就好啦!
开始撸代码了!!!
第一个是 class Spider(): 我们声明了一个类,然后我们使用 def __init__去声明一个构造函数

分析怎么提取末页链接如下图:

这里我们采用多线程的方式爬取,引入下面几个模块

新增加一个全局的变量,而且是多线程操作,我们需要引入线程锁,避免资源同时写入出错。
all_img_urls = []#所有图片链接
g_lock = threading.Lock()#初始化一个锁
声明一个Producer的类,负责提取图片链接,然后添加到 all_img_urls 这个全局变量中

线程锁,在上面的代码中,当我们操作all_urls.pop(0)的时候,我们是不希望其他线程对他进行同时操作的,否则会出现意外,所以我们使用g_lock.acquire()锁定资源,然后使用完成之后,记住一定要立马释放g_lock.release(),否则这个资源就一直被占用着,程序无法进行下去了。

下面再定义一个DownPic类 用于下载图片

可以看到利用了down_time = str(round(t * 1000)) 来生成毫秒级时间戳来命名图片 其实也可以获取图片的名称来命名 那就靠自己去写一个了
再从if __name__ == "__main__": 添加下面代码 用于开启多线程下载

整体流程就这么写完啦!run下代码

Tips:跑这个代码需要在D盘创建test文件夹 或者自己修改代码实现其他功能
附出完整代码:

网友评论