自我介绍
我是新晋小编,现是大三准程序员一名,没啥昵称,随便称呼吧,也没有什么目的,只是发一些自己感兴趣的东西,如果你有什么想分享的东西也可以私聊我。
今天第一次发文讲一下前段时间爬取的一个妹子图网站
本人是主java的,python只是学习了一下爬虫。
目标站点:妹子图(不能贴链接,你们应该也看得出来的。)
python版本:3.5+
框架:scrapy
首先分析站点
1、从首页进去可以发现是xxx/page/数字的形式,底部有页码编号和地址。
每一页又有3*8个具体可点击的图片栏目,进去之后是一页一张图片的形式查看。
同样底部有页码编号和可点击地址。(关键点有下一页地址和总页码)
2、既然是爬取全站,必须考虑一个栏目爬完后的后续过程。
这里我们可以假想过程:
处理每一个page和每一个栏目分为两部分
处理page:
第一页 =》获取3*8=24个栏目的地址 =》每一个栏目调用处理栏目
获取下一页回调这一步骤
处理栏目:
获取栏目总有多少页(有页码规律:/页数)
遍历每一页=》获取图片地址=》下载
关键点和坑点
按照思路是可以爬取全部图片成功的,但是其中有许多坑。这里不展示代码,只讲述注意项。
1、处理栏目时,我在获取栏目地址时就创建了文件夹,这样就可以为图片分栏目,如果进去栏目,
获取每张图片的栏目名称再创建文件夹,就会加很多的if判断创建过没,效率低。
2、scrapy本来有自带的下载,但是我需求有一点不一样,所以还是用的普通的下载方法
3、上述思路不错,但可以注意到处理栏目和处理page不一样,不是用的回调,原因是栏目点击到最后一页
后,还是会有一个标签叫”下一组“,这样就不会停止,而且会有重复图片,基本卡死。
4、我最开始的思路是:获取共有多少页,然后直接page/页码的形式访问,就可以少
很多的访问下一页,也可以避免下一组的问题,可以看出我处理栏目是就用的这个方法,但是处理page没有
结果展示
总结反思
1、爬取一夜后,获得全站90%以上的图片,大概12g,有些是网站临时更新的,还有些可能是网络问题,打
开慢就跳过了,总的来说不错
2、分析一下其实可以明白上述坑点“下一组”,是可以利用的,直接访问第一页的第一个栏目,然后以下一页的方法,
理论上可以直接访问完全部图片。我没有进行尝试,留待有需的人用,不过可以思考到几个效率点是:如果采用这
种方法,什么是时候创建栏目文件夹好?无法判断,所以只能每一页都用if判断创建过没,没有就创建。当然也可以
不创建栏目文件夹,那么你全部图片都在一个文件乱七八糟,但速度应该很快。
3、代码详情在我的github上,地址:github/neocou/python-scrapy-mzitu,有兴趣的看看吧。
4、图片太大了只能放在自己d盘了,网盘都传不上去。
5、第一篇文章就写框架使用,但实际我还有很多基础爬虫,另外也有java 项目,最近也学了下android,有兴趣再更。