昨天和女朋友斗图输了(无中生女友),被百般嘲讽。QQ、微信斗图总是斗不过,索性直接来爬斗图网,我有整个网站的图,还有谁我斗不过?
话不多说,选取的网站为斗图啦,我们先简单来看一下网站的结构
网页信息
从上面这张图我们可以看出,一页有多套图,这个时候我们就要想怎么把每一套图分开存放(后边具体解释)
通过分析,所有信息在页面中都可以拿到,我们就不考虑异步加载,那么要考虑的就是分页问题了,通过点击不同的页面,很容易看清楚分页规则
很容易明白分页URL的构造,图片链接都在源码中,就不做具体说明了明白了这个之后就可以去写代码抓图片了
存图片的思路
因为要把每一套图存入一个文件夹中(os模块),文件夹的命名我就以每一套图的URL的最后的几位数字命名,然后文件从文件路径分隔出最后一个字段命名,具体看下边的截图。
这些搞明白之后,接下来就是代码了(可以参考我的解析思路,只获取了30页作为测试)全部源码
# -*- coding:utf-8 -*-importrequestsfrombs4importBeautifulSoupimportosclassdoutuSpider(object):headers = {"user-agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"}defget_url(self,url):data = requests.get(url, headers=self.headers) soup = BeautifulSoup(data.content,'lxml') totals = soup.findAll("a", {"class":"list-group-item"})foroneintotals: sub_url = one.get('href')globalpath path ='J:\\train\\image'+'\\'+sub_url.split('/')[-1] os.mkdir(path)try: self.get_img_url(sub_url)except:passdefget_img_url(self,url):data = requests.get(url,headers = self.headers) soup = BeautifulSoup(data.content,'lxml') totals = soup.find_all('div',{'class':'artile_des'})foroneintotals: img = one.find('img')try: sub_url = img.get('src')except:passfinally: urls ='http:'+ sub_urltry: self.get_img(urls)except:passdefget_img(self,url):filename = url.split('/')[-1]globalpath img_path = path+'\\'+filename img = requests.get(url,headers=self.headers)try:withopen(img_path,'wb')asf: f.write(img.content)except:passdefcreate(self):forcountinrange(1,31): url ='https://www.doutula.com/article/list/?page={}'.format(count)print'开始下载第{}页'.format(count) self.get_url(url)if__name__ =='__main__': doutu = doutuSpider() doutu.create()
结果
总结
总的来说,这个网站结构相对来说不是很复杂,大家可以参考一下,爬一些有趣的网站
--------------------------------------分割线---------------------------------------
在这里我相信有很多想要学习Python的小伙伴,我自己是一名从事了多年开发的Python老程序员,辞职目前在做自己的私人定制课程,今年年初我花了一个月整理了一份最适合2019年学习的学习干货,从最基础到,各种框架都有整理,送给每一位Python小伙伴,想要获取的可以关注我的头条号并在后台私信我:学习,即可免费获取。
人生苦短,我用Python!