首页
学习
活动
专区
工具
TVP
发布

Python爬虫爬取斗图网表情包10万张

爬图片比爬文字数据要好玩得多了,但是由于图片比文字所占内存更大,所以所耗的时间会多一些,因此可以尝试使用多线程爬虫来爬取网站的图片。

这次的目标是【斗图啦】,网上看到很多教程都有爬斗图网的,小v爬这个网站纯粹是为了练习下多线程爬虫,也有很多不足的地方,还要多多学习。

初始的网址为:

还是和往常一样,先打开要爬取的网页,对页面进行分析。按下F12,找到要爬取的图片的网页结构中的定位元素,如图下,在data-original处的链接就是图片的下载地址。

经历了一系列的测试,小V觉得用正则表达式直接去匹配获取是比较简便的。正则表达式的匹配语句为:

再来看看页面页码的元素:

要获取的是总页面数1690,则找到下图它的定位元素:

用BeautifulSoup的css路径选择器根据它的css路径定位:

分析完了就可以写代码了。整理下思路,由于python的线程数量有限,大概最多也只能有1000个左右的线程。

在我的代码中,每次爬10页(用了10个线程),每一页里有68张图片(用68个线程),所以一共680个线程。总共有1690页,114920张图片,创建10万个线程是不可能的了。所以便用这680个线程去爬这11多万张图片。每次爬10页,分169次爬完。

这些图片中有一些图是gif图,gif图就不爬了,所以在获取图片链接的时候只获取jpg结尾的链接。除去gif图我们要爬的图片大概有9万多张。

按道理来说,程序一直执行下去就能把9万张图爬下来了,如果这个网站没有什么反爬虫的策略的话。亲测了几次貌似是没有,唯一个问题就是下载其中一些图片的时候响应等待时间太长,就一直等待着没响应,会导致线程一直在那等,不继续向下走。因此我把requests.get()的等待时间设为15秒,15秒若还在等待就直接跳过,把那张图片的链接存在列表中,待其他图片爬完后则再爬一便这些没下载成功的图片。

程序共定义了3个线程类:

访问每一页的线程类:用于获取每一页的所有图片链接,并存到列表中,每次访问10页。

下载图片的线程类:访问图片链接列表中的链接,下载的图片数据传输给存储器类。

存储图片的线程类:把下载器传过来的图片数据存储到本地,存储成jpg格式。

主程序弄一个while循环,每次爬10页,等爬到1690页的时候,再爬一遍之前爬失败的图片,然后就跳出循环,结束程序。

程序执行过程的截图:

程序执行到最后,会再次下载之前下载失败的图片,重新成功下载了3张,有4张还是下载失败了。一共爬了91667张,用时2757s,也就是46分钟就爬完了,在白天测得的这个速度还是可以的,若是在晚上校园网渣网速超级慢的情况下,经过测试得花上2个小时。

查看记录失败信息的txt文件:

看看爬到的图片:

再放一张比较应景的图:

最后放全部的代码:

把程序中的.jpg改成.gif就能爬取gif动图啦~

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

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券