专栏名称: Python中文社区
致力于成为国内最好的Python开发者学习交流平台,这里有关于Python的国内外最新消息,每日推送有趣有料的技术干货和社区动态。 官方网站:www.python-cn.com
目录
相关文章推荐
Python爱好者社区  ·  王炸!DeepSeek彻底爆了! ·  23 小时前  
Python开发者  ·  OpenAI 上线 GPT 4.5,Pro ... ·  2 天前  
Python爱好者社区  ·  同事年底绩效是C,提离职领导死活不让走,后来 ... ·  2 天前  
Python爱好者社区  ·  刚刚,奥特曼晒出早产娃引爆全网!两个爸爸孕育 ... ·  2 天前  
小小的python学习社  ·  Python100道真题题库 ·  昨天  
51好读  ›  专栏  ›  Python中文社区

多线程爬取斗图网站,赶紧上车

Python中文社区  · 公众号  · Python  · 2017-07-17 22:51

正文

專 欄


致Great ,Python中文社区专栏作者

博客:

http://www.jianshu.com/u/261e23a40f71

最近看了Python多线程的相关内容,并且前几天观看了关于斗图网爬取的公开课,课程内容大致是利用Python多线程爬取斗图(多页),并将图片保存到本地。自己写这篇文章总结下这个项目的所涉及的知识,并将实现过程分享给大家。

首先:分析网站,找到图片的src地址

打开网址: https://www.doutula.com/article/list/?page=1 ,从网址,我们可以推断出page={页码数字}是为了控制分页。

在每一中,我们可以看到大致有10个套图(套图点击之后是套图里面的具体图片,大致每个套图里有9张表情图),分别放在class为.list-group-item的a标签里,详情如下面的两张图片:

套图位置

每页10个套图a标签

点击一个套图连接之后,我们可以看到套图下的所有图片,然后选择一张图片观察它的src地址,后来发现就是img的属性 onerror的内容(至于为什么不是img下的src,大家可以访问地址试下)

onerror属性

img的src地址

其次:爬取思路(关键)

在第一步分析网站准备工作之后,我们思考下:怎么实现多页爬取?怎么获取每一页所有套图的连接?怎么获取每一套图里面所有表情图片的src?最后怎么实现多线程爬取(加快速度)?为了实现思路清晰,我们将每个模块封装成函数,下面相关代码模块:

引入模块

(1)获取一个网页的源码

url地址是指每一页的地址,等会用format函数传递页码,实现多页爬取

获取一页的源码

(2)获取每一页的所有套图的链接,利用套图链接去获取所有套图详情网页源码(有点绕)


获取带有图片的源码

(3)利用xpath获取每一个图片的带有src地址的onerror属性内容

图片所在div

获取onerror内容

这里解释下这段代码:一页中有10个套图,然后每个套图中有9个图片,所以我们在这里获得的items有90个(图片所在的div),然后我们在每一个items中获取onerror里的内容,以便(4)步中的start_save_img()调用

(4)利用正则获取onerror内容里的图片src地址,然后用多线程实现下载图片

多线程下载图片

首先解释下 start_save_img(imgurl_list):参数 imgurl_list是我们(3)中获得onerror的内容(注意:不是图片的src地址,我们还要用注册和切片处理下)。其中我们在for循环中创建一个线程,调用的方法是save_img,传递的参数是onerror

save_img(img_url):接到onerror,用正则和切片处理后获得到每个图片的src地址,最后保存到本地,% img_url.split('/')[-1]这个事命名方式,大家可以仔细观察下每个图片得src地址最一个/后的内容不一样(这里大家也可以用其他方式命名)

(5)调用方法执行

多页爬取

最后:运行代码,效果如下:







请到「今天看啥」查看全文